首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何合并基于两列的多个数据帧?

如何合并基于两列的多个数据帧?
EN

Stack Overflow用户
提问于 2017-07-22 00:17:08
回答 2查看 10.3K关注 0票数 2

我有超过4天收集的数据的多个数据帧。每个数据框看起来像这样(非常简单):

代码语言:javascript
复制
Lat           Long       PM
-33.9174    151.2263     8
-33.9175    151.2264     10 
-33.9176    151.2265     9
-33.9177    151.2266     8

我想根据匹配的长度值和纬度值合并多个数据帧,以求取特定位置的所有'PM‘值的平均值。最终结果将如下所示(2月13日至16日):

代码语言:javascript
复制
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个数据帧很容易:

代码语言:javascript
复制
df = merge(data1, data2, by.x = c("Lat", "Long"), by.y = c("Lat", "Long"))

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

另外,有没有一种方法可以过滤数据,使其匹配相互之间在0.001经度/经度范围内的数据?(目前我正在将经度/经度数据四舍五入到小数点后3位,但它正在复制我的数据)。

EN

回答 2

Stack Overflow用户

发布于 2017-07-22 00:36:20

为了匹配,也许是来自dplyr的inner_join?

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2017-07-24 02:02:05

这可能是一个答案,尽管它有点冗长,对于大量的数据帧来说不是很好:

代码语言:javascript
复制
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))

这是第一个技巧。简单,但取平均值在这里是丑陋的.

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45242360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档