Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中的data.table中,如何在数据表中创建一个新列,该列的值与列元素和另一个表匹配并对应?_R_Data.table - Fatal编程技术网

在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