Je suis un nouveau chez R, alors pardonne mon ignorance.
J'ai un dataframe qui se compose de deux variables: l'emplacement et la réponse. J'ai une autre base de données qui consiste en un effort d'échantillonnage à chaque emplacement. Je dois diviser la réponse par l'effort d'échantillonnage en utilisant l'emplacement comme identifiant. Je sais qu'il existe probablement une solution facile, mais je suis en train de la trouver. J'apprécierais toute aide.
Example:
Dataframe 1
Location Response
Loc1 25
Loc2 63
Loc3 5.63
Dataframe2
Location Sampling effort
Loc1 2
Loc2 6.5
Loc3 3
4 réponses
Une approche dplyr
/ tidyverse
:
Code pour répliquer vos dataframes
df1 <-
read.table(text = "Location Response
Loc1 25
Loc2 63
Loc3 5.63
", header = TRUE, stringsAsFactors = FALSE)
df2 <-
read.table(text = "Location Sampling_effort
Loc1 2
Loc2 6.5
Loc3 3
", header = TRUE, stringsAsFactors = FALSE)
Code pour générer le calcul de la taille de l'effet
library(dplyr)
df_joined <-
df1 %>%
left_join(df2) %>%
mutate(Effect_size = Response / Sampling_effort)
Ce qui se traduit par:
> df_joined Location Response Sampling_effort Effect_size 1 Loc1 25.00 2.0 12.500000 2 Loc2 63.00 6.5 9.692308 3 Loc3 5.63 3.0 1.876667
Il y a beaucoup de bonnes introductions à la manipulation des données dans R, mais nous avons trouvé le datacamp utile - bien qu'il ne soit plus gratuit.
Vous pouvez les fusionner en utilisant merge()
, puis diviser simplement deux colonnes:
df3 <- merge(df1, df2)
df3$solution <- df3$Response / df3$Sampling_effort
df3
# Location Response Sampling_effort solution
# 1 Loc1 25.00 2.0 12.500000
# 2 Loc2 63.00 6.5 9.692308
# 3 Loc3 5.63 3.0 1.876667
J'ai utilisé les données:
df1 <- structure(list(Location = structure(1:3, .Label = c("Loc1", "Loc2",
"Loc3"), class = "factor"), Response = c(25, 63, 5.63)), .Names = c("Location",
"Response"), class = "data.frame", row.names = c(NA, -3L))
df2 <- structure(list(Location = structure(1:3, .Label = c("Loc1", "Loc2",
"Loc3"), class = "factor"), Sampling_effort = c(2, 6.5, 3)), .Names = c("Location",
"Sampling_effort"), class = "data.frame", row.names = c(NA, -3L))
Comme vos dataframes suivent le même ordre, il devrait suffire de faire
df1[,2]/df2[,2]
df1$Response/df2$Sampling_effort[match(df1$Location, df2$Location)]
#[1] 12.500000 9.692308 1.876667
Questions connexes
De nouvelles questions
r
R est un langage de programmation et un environnement logiciel libres et open source pour le calcul statistique, la bioinformatique, la visualisation et le calcul général. Veuillez fournir des exemples minimaux et reproductibles ainsi que le résultat souhaité. Utilisez dput () pour les données et spécifiez tous les packages non basiques avec des appels à library (). N'incorporez pas d'images pour les données ou le code, utilisez plutôt des blocs de code en retrait. Pour les questions relatives aux statistiques, utilisez https://stats.stackexchange.com.