r - 如何使用多个列执行左连接,其中一个数据框在一列中有缺失?

标签 r dplyr merge left-join

假设我有两个如下所示的数据框:

df1 <- data.frame(
    id1  = c(1:4, 4),
    id2  = letters[1:5],
    val1 = c(0, 1, pi, exp(1), 42)
)

df2 <- data.frame(
    id1  = c(1:4, 4),
    id2  = c(NA, letters[2:5]),
    val2 = c("Lorem", "ipsum", "dolor", "sit", "amet")
)

##   df1                   df2
##   id1 id2      val1     id1  id2  val2
## 1   1   a  0.000000       1 <NA> Lorem
## 2   2   b  1.000000       2    b ipsum
## 3   3   c  3.141593       3    c dolor
## 4   4   d  2.718282       4    d   sit
## 5   4   e 42.000000       4    e  amet

这将是我想要的结果:

desired_result <- data.frame(
    id1  = c(1:4, 4),
    id2  = letters[1:5],
    val1 = c(0, 1, pi, exp(1), 42),
    val2 = c("Lorem", "ipsum", "dolor", "sit", "amet")
)

##   id1 id2      val1  val2
## 1   1   a  0.000000 Lorem
## 2   2   b  1.000000 ipsum
## 3   3   c  3.141593 dolor
## 4   4   d  2.718282   sit
## 5   4   e 42.000000  amet

在我想要的结果中,我想使用 id2 列中的信息,可用时, 解决由 id1 中的重复值引起的连接歧义。 例如,第4行和第5行的id1相同,但我们可以通过id2来区分它们。 所以,如果我尝试在 id1 上加入 just,我会得到太多的观察结果, 因为我没有利用 id2 中的这些信息来匹配记录:

library(dplyr)
left_join(df1, df2, by = "id1")
##   id1 id2.x      val1 id2.y  val2
## 1   1     a  0.000000  <NA> Lorem
## 2   2     b  1.000000     b ipsum
## 3   3     c  3.141593     c dolor
## 4   4     d  2.718282     d   sit
## 5   4     d  2.718282     e  amet
## 6   4     e 42.000000     d   sit
## 7   4     e 42.000000     e  amet

但是,如果我尝试加入两个 ID,我会丢失第 1 行的 val2 中的信息, 因为 df2 在第 1 行的 id2NA:

left_join(df1, df2, by = c("id1", "id2"))
##  id1 id2      val1  val2
## 1   1   a  0.000000  <NA>
## 2   2   b  1.000000 ipsum
## 3   3   c  3.141593 dolor
## 4   4   d  2.718282   sit
## 5   4   e 42.000000  amet

我如何left_join()(或等价物)来实现我的desired_result

最佳答案

使用 data.table 的选项:

library(data.table)
setDT(df1)
setDT(df2)
df1[df2, on=.(id1, id2), mult="first", val2 := val2]
df1[is.na(val2), val2 :=
    df2[.SD, on=.(id1), mult="first", val2]]

如果有多个连接(即 df2 中 id1 和 id2 的组合不是唯一的),我会冒昧地使用第一个值。

关于r - 如何使用多个列执行左连接,其中一个数据框在一列中有缺失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68310526/

相关文章:

R Mapreduce 库 'rmr2' 在加载时显示警告消息

r - 从 map() 调用加入 data.frames 列表

merge - gitlab 请求将分支 A 合并到开发中(后面 3 个提交)我应该担心吗?

javascript - Jquery 和常规 Javascript 干扰

java - Subclipse 合并问题 - 试运行与合并结果不匹配

替换 kable/R markdown 中的列名

r - 如何加速 R 中的 for 循环?

r - 在 data.table 中为多个类别的每个组合添加缺失值

r - 导致长度不等于 1 或 dplyr 中组长度的分组操作

r - 使用 dplyr 和 broom 在训练和测试集上计算 kmeans