在R中的data.table中,如何在数据表中创建一个新列,该列的值与列元素和另一个表匹配并对应?
我目前有两张桌子:在R中的data.table中,如何在数据表中创建一个新列,该列的值与列元素和另一个表匹配并对应?,r,data.table,R,Data.table,我目前有两张桌子: A B 3.3 10 2.5 11 6.7 11 6.0 12 5.4 12 3.5 12 6.5 13 8.0 13 及 我们要做的是在第一个表中创建一个新的列C,这样它就包含了对应于第一个表中与第二个表中的B相匹配的B元素的值Val。我想获得: A B C 3.3 10 0 2.5 11 1 6.7 11 1 6.0 12 2 5.4 12 2 3.5 12 2 6.5 13 3 8.0 13 3 示例代码为: DT.1 <- data.table(
A B
3.3 10
2.5 11
6.7 11
6.0 12
5.4 12
3.5 12
6.5 13
8.0 13
及
我们要做的是在第一个表中创建一个新的列C,这样它就包含了对应于第一个表中与第二个表中的B相匹配的B元素的值Val。我想获得:
A B C
3.3 10 0
2.5 11 1
6.7 11 1
6.0 12 2
5.4 12 2
3.5 12 2
6.5 13 3
8.0 13 3
示例代码为:
DT.1 <- data.table(A=c(3.3,2.5,6.7,6.0,5.4,3.5,6.5,8.0), B=c(10,11,11,12,12,12,13,13))
DT.2 <- data.table(B=c(10,11,12,13),Val=c(0,1,2,3))
DT.1连接部分肯定是重复的。。我包括了这个答案,因为一些重命名/重新排序也正在进行中
dt1 <- fread("A B
3.3 10
2.5 11
6.7 11
6.0 12
5.4 12
3.5 12
6.5 13
8.0 13", header = TRUE)
dt2 <- fread("B Val
10 0
11 1
12 2
13 3", header = TRUE)
result <- dt2[dt1, on = .(B)]
setcolorder(result, c("A", "B", "Val") )
setnames(result, old = "Val", new = "C")
# A B C
# 1: 3.3 10 0
# 2: 2.5 11 1
# 3: 6.7 11 1
# 4: 6.0 12 2
# 5: 5.4 12 2
# 6: 3.5 12 2
# 7: 6.5 13 3
# 8: 8.0 13 3
dt1这肯定是重复的。搜索“更新加入”,你会发现很多帖子。一种有效的语法是DT.1[DT.2,val:=i.val,on=“B”]
。这似乎更简单:dt1[dt2,on=“B”,C:=val];dt1
@markus嘿,太酷了!为什么该联接的行为类似于左联接?。。旁注:最终结果上的[]
是否与相同;dt1
正如您所知,[]
打印DT-是的,它与相同;dt1
。分号只是模仿注释中的换行符。查看链接帖子中Jaap的答案了解详细信息。当我第一次读到它时,我学到了很多。@markus谢谢!!我不知道这个。。。这确实有助于改善我的记忆优化。。我使用了Y[X]
很多:)
dt1 <- fread("A B
3.3 10
2.5 11
6.7 11
6.0 12
5.4 12
3.5 12
6.5 13
8.0 13", header = TRUE)
dt2 <- fread("B Val
10 0
11 1
12 2
13 3", header = TRUE)
result <- dt2[dt1, on = .(B)]
setcolorder(result, c("A", "B", "Val") )
setnames(result, old = "Val", new = "C")
# A B C
# 1: 3.3 10 0
# 2: 2.5 11 1
# 3: 6.7 11 1
# 4: 6.0 12 2
# 5: 5.4 12 2
# 6: 3.5 12 2
# 7: 6.5 13 3
# 8: 8.0 13 3