gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:54:43 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com