【发布时间】:2020-03-10 11:48:16
【问题描述】:
我有两个 data.tables。我想将第二个 data.table 中的信息与第一个合并:
DT1 <- fread(
"Val C D E F iso year
1 NA 1 NA NA NLD 2001
1 NA 2 NA NA NLD 2002
1 NA 3 NA NA GRC 2001
1 NA 3 NA NA GRC 2002",
header = TRUE)
DT2 <- fread(
"Val name O P Q R iso year
1 A NA 1 NA NA NLD 2001
1 A NA 2 NA NA NLD 2001
1 B NA 1 NA NA NLD 2001
1 B NA 2 NA NA NLD 2002
1 A NA 1 NA NA NLD 2002
1 B NA 2 NA NA NLD 2002
1 C NA 3 NA NA GRC 2001
1 C NA 3 NA NA GRC 2001
1 C NA 3 NA NA GRC 2001
1 A NA 3 NA NA GRC 2002
1 A NA 3 NA NA GRC 2002
1 B NA 3 NA NA GRC 2002",
header = TRUE)
我想将DT2的name下的信息添加到DT1如下。如果 iso == NLD 名称 A 存在(无论多久),则 A 列将用 A 填充,如果不存在则保持 NA:
DT1 <- fread(
"Val C D E F iso year A B C
1 NA 1 NA NA NLD 2001 A B NA
1 NA 2 NA NA NLD 2002 A B NA
1 NA 3 NA NA GRC 2001 NA NA C
1 NA 3 NA NA GRC 2002 A B NA",
header = TRUE)
但我不知道怎么去那里。我一直在尝试类似的东西:
DT[,A:="A"]
DT[,B:="B"]
DT[,C:="C"]
DT2$name[DT, on=c(iso="iso", year="year", name="A"), nomatch=0L]
或
merge(DT, DT2$name, on=c(iso="iso", year="year", A="name"), all.x = TRUE, allow.cartesian=FALSE)
但我认为必须以不同的方式解决它。谁能帮帮我?
【问题讨论】:
-
所以“O P Q R”列不相关?
-
我不确定这是否是您想要的输出,但可能是:
DT3 <- merge(DT1, DT2, by=c('Val', 'iso', 'year'), all=T),然后是DT3[iso=='NLD' & name == 'A', A := 'A'] -
@zx8754 确实如此。我主要是让这个例子稍微复杂了一点,因为否则我有时会得到不够通用的解决方案,无法应用于实际数据。只有
name列是相关的。
标签: r merge data.table reshape melt