2017-07-21 1 views
1

Je ne connais pas R et j'ai besoin d'aide.Comment fusionner plusieurs blocs de données basés sur deux colonnes?

J'ai plusieurs trames de données pour les données recueillies sur 4 jours. Chacune des trames de données ressemble à ceci (mis très simplement):

Lat   Long  PM 
-33.9174 151.2263  8 
-33.9175 151.2264  10 
-33.9176 151.2265  9 
-33.9177 151.2266  8 

Je veux fusionner plusieurs trames de données en fonction de leur correspondant à des valeurs longues et Lat, en moyenne sur toutes les valeurs « PM » à un endroit particulier. Le résultat final ressemblera à quelque chose comme ça (pour le 13 au 16 février):

Lat   Long PM.13th Feb PM.14th Feb PM.15th Feb **Mean** 
-33.9174 151.2263  8   9   11   9.33 
-33.9175 151.2264  10   11   12   11 
-33.9176 151.2265  9   14   13   12 
-33.9177 151.2266  8   10   11   9.66 

Je comprends que la fusion de 2 trames de données est assez facile:

df = merge(data1, data2, by.x = c("Lat", "Long"), by.y = c("Lat", "Long")) 

Mais comment puis-je fusionner plusieurs dataframes base sur la correspondance des valeurs Longitude et Latitude?

De même, existe-t-il un moyen de filtrer les données afin qu'elles correspondent aux données qui se situent dans les limites de 0.001 Lat/Long les unes des autres? (Actuellement, je arrondis les données Lat/Long à 3 décimales, mais il duplique mes données).

Merci!

+0

Cochez cette question https: // stackoverflow. com/questions/8091303/simultanément-merge-multiple-data-frames-in-a-list – Lamia

Répondre

0

Pour faire correspondre, peut-être un inner_join de dplyr?

library(dplyr) 
df1 <- data.frame(
    lat = c(-33.9174, -33.9175, -33.9176, -33.9177, -33.9171), 
    long = c(151.2263, 151.2264, 151.2265, 151.2266, -140.54), 
    PM = c(8, 10, 9, 8, 55) 
) 

df2 <- data.frame(
    lat = c(-33.9174, -33.9175, -33.9176, -33.9177, -31), 
    long = c(151.2263, 151.2264, 151.2265, 151.2266, 134), 
    PM = c(12, 15, 11, 3, 18) 
) 

library(dplyr) 

inner_join(df1, df2, by = c("lat", "long")) 

     lat  long PM.x PM.y 
1 -33.9174 151.2263 8 12 
2 -33.9175 151.2264 10 15 
3 -33.9176 151.2265 9 11 
4 -33.9177 151.2266 8 3 
+0

Salut merci pour la réponse! Je me demandais comment je voudrais rejoindre plusieurs cadres ensemble? En faisant cela internal_join signifie qu'il classe chaque nouvelle trame de données dans un x ou un y, donc elle a des problèmes pour joindre plusieurs dataframes ensemble. Des pensées? Merci! – Imogen

0

ici pourrait être une réponse, mais il est un peu bavard et ne serait pas grand pour un grand nombre de dataframes:

library(tidyverse) 
feb_13 <- data_frame(lat = c(-33.9174,-33.9175,-33.9176,-33.9177), 
       long = c(151.2263, 151.2264,151.2265,151.2266), 
       pm = c(8,10,9,8)) 

feb_14 <- data_frame(lat = c(-33.9174,-33.9175,-33.9176,-33.9177), 
       long = c(151.2263, 151.2264,151.2265,151.2266), 
       pm = c(7,3,4,5)) 

feb_15 <- data_frame(lat = c(-33.9174,-33.9175,-33.9176,-33.9177), 
       long = c(151.2263, 151.2264,151.2265,151.2266), 
       pm = c(1,4,10,12)) 

C'est la première technique. Simple, mais en prenant la moyenne est laid ici ...

df <- left_join(feb_13, feb_14, by = c("lat", "long")) %>% 
     left_join(feb_15, by = c("lat", "long")) %>% 
     rename(
     pm_feb13 = pm.x, 
     pm_feb14 = pm.y, 
     pm_feb15 = pm 
     ) %>% 
     mutate(
     mean = c((pm_feb13[1] + pm_feb14[1] + pm_feb15[1])/3, 
        (pm_feb13[2] + pm_feb14[2] + pm_feb15[2])/3, 
        (pm_feb13[3] + pm_feb14[3] + pm_feb15[3])/3, 
        (pm_feb13[4] + pm_feb14[4] + pm_feb15[4])/3) 
     ) 

Voici la deuxième option, qui a beaucoup de tuyaux, mais utilise summarize

df_2 <- left_join(feb_13, feb_14, by = c("lat", "long")) %>% 
      left_join(feb_15, by = c("lat", "long")) %>% 
      group_by(lat, long) %>% 
      summarise(
      mean = mean(c(pm.x, pm.y, pm), na.rm=T) 
     ) %>% 
      full_join(feb_13, by = c("lat", "long")) %>% 
      full_join(feb_14, by = c("lat", "long")) %>% 
      full_join(feb_15, by = c("lat", "long")) %>% 
      rename(
      pm_feb13 = pm.x, 
      pm_feb14 = pm.y, 
      pm_feb15 = pm 
     ) %>% 
      arrange(long) 
+0

Merci, je vais essayer ... même si j'ai environ 300 lignes dans chacune des trames de données! Dites-moi comment je me porte :) – Imogen

+0

Hey Imogen, comment ça s'est passé? – Nick