【问题标题】:merge data.frame different length and condition by two columns通过两列合并data.frame不同的长度和条件
【发布时间】:2017-12-12 14:15:44
【问题描述】:

我正在尝试合并 2 个不同长度的 data.frame。在引用坐标(经度和纬度)的列的值没有相同的位置中,我想要 NA。我正在使用合并,但结果不正确,我不知道我做错了什么。在第二个数据框没有相同坐标的列中应该有 NA (或我期望的),并且当两个 data.frames 中的坐标(列 lon 和 lat)相同时保留值。 这些是我原始数据的一个简短示例,如下所示:

#d1

               lon lat   MDA8O3
               -17.0  32 79.32538
               -16.6  32 79.36805
               -16.2  32 79.36243
               -15.8  32 79.36818
               -15.4  32 79.36213
               -15.0  32 79.34682
# d2
                  O3  lon   lat
            91.09123 13.8 48.50
            93.46220 16.6 47.75
            90.93342 15.8 48.75
            93.77436 13.0 46.75
            38.84968 11.8 47.25
            93.88587 14.6 47.75

现在,我使用: df

但是,结果不正确:

             lon lat   MDA8O3       O3
             -17  32 79.32538 25.10291
             -17  32 79.32538 52.06498
             -17  32 79.32538 73.24021
             -17  32 79.32538 31.79225
             -17  32 79.32538 20.99357
             -17  32 79.32538 24.55819

我也尝试使用 all=T,但它不正确。在 O3 列中,那些与第一个 data.frame 的 lon 和 lat 不匹配的 lon 和 lat 应该是 NA。

我做错了什么?我认为可以在这里使用合并,有什么建议吗?

谢谢!

【问题讨论】:

  • 尝试使用dplyr包中的left_join()函数。它应该可以满足您的需求,并且工作方式与 merge 相同(而且效率更高)。
  • 我无法复制您的结果表。当我运行完全相同的代码(使用 all.x = T)时,我得到了 O3 列中的所有 NA,如您所料。
  • 当我进行合并时,我得到了所有 NAO3。我的猜测:你已经分配了一个名为T 的变量。始终使用 TRUEFALSE 进行逻辑运算。试试merge(d1, d2, by = c("lon", "lat"), all.x = TRUE)
  • 是的,O3 列中的所有数字都不存在于 d1 或 d2 中,这似乎很奇怪。
  • 可能是因为数组长度不同?我只对我作为示例放在这里的短样本(这是每个原始数据的头部)做同样的事情,我得到了 NA,就像你一样。但是如果我使用原始数据,我不知道 NA.. 有什么想法吗?

标签: r


【解决方案1】:

dplyr 包中的left_join() 函数应该可以工作。

dat1 <- data.frame(lon = c(-17, -16.6, -16.2, -15.8, -15.4, -15),
                   lat = rep(32, 6),
                   MDA8o3 = c(79.32538, 79.36805, 79.36243, 79.36818, 79.36213, 79.34682))

dat2 <- data.frame(lon = c(13.8, 16.6, 15.8, 13.0, 11.8, 14.6),
                   lat = c(48.50, 47.75, 48.75, 46.75, 47.25, 47.75),
                   o3 = c(91.09123, 93.46220, 90.93342, 93.77436, 38.84968, 93.88587))


library(dplyr)

res <- left_join(dat1, dat2, by = c("lon", "lat"))

【讨论】:

  • 我用 left_join 得到了类似的结果 :(
  • 你能在你的例子中添加一些匹配的行吗?您的 2 个 data.frames 之间似乎没有共同的 lon/lat 组合。
猜你喜欢
  • 2018-07-26
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2015-07-11
相关资源
最近更新 更多