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
r
1
Switters 15 nov. 2017 à 19:01

4 réponses

Meilleure réponse

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.

1
leerssej 15 nov. 2017 à 16:17

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))
4
KenHBS 15 nov. 2017 à 16:05

Comme vos dataframes suivent le même ordre, il devrait suffire de faire

df1[,2]/df2[,2]
0
Dejan 15 nov. 2017 à 16:08
df1$Response/df2$Sampling_effort[match(df1$Location, df2$Location)]
#[1] 12.500000  9.692308  1.876667
1
d.b 15 nov. 2017 à 16:13
47311997