【问题标题】:How to merge multiple data frames based on two columns? [duplicate]如何基于两列合并多个数据框? [复制]
【发布时间】:2017-12-27 18:47:24
【问题描述】:

我有多个数据框用于 4 天内收集的数据。每个数据框看起来像这样(很简单):

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

我想根据匹配的 Long 和 Lat 值合并多个数据框,以平均特定位置的所有“PM”值。最终结果将如下所示(2 月 13 日至 16 日):

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

我知道合并 2 个数据框很容易:

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

但是如何根据匹配的经度和纬度值合并多个数据帧?

另外,有没有一种方法可以过滤数据,以便匹配彼此在 0.001 Lat/Long 值范围内的数据? (目前我将 Lat/Long 数据四舍五入到小数点后 3 位,但它复制了我的数据。

【问题讨论】:

标签: r dataframe merge gps dplyr


【解决方案1】:

对于匹配,也许是来自 dplyr 的 inner_join?

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

【讨论】:

  • 您好,感谢您的回复!我只是想知道如何将多个框架连接在一起?执行此 inner_join 意味着它将每个新数据帧分类为 x 或 y,因此很难将许多数据帧连接在一起。有什么想法吗?谢谢!
【解决方案2】:

这可能是一个答案,虽然它有点冗长,并且对于大量数据帧来说不是很好:

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))

这是第一种技术。很简单,但是在这里取平均值很丑......

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)
        )

这是第二个选项,它有很多管道,但使用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)

【讨论】:

  • 谢谢,我会试一试...虽然我在每个数据框中都有大约 300 行!让你知道我是怎么过的:)
  • 嗨,Imogen,最近怎么样?
猜你喜欢
  • 2011-10-06
  • 1970-01-01
  • 2018-01-30
  • 2019-05-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多