基于另一列R data.table添加列

基于另一列R data.table添加列,r,data.table,R,Data.table,我在R中有两个数据表: #install.packages("data.table") library(data.table) dt1 <- data.table(Num = c(1,1,1,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5)) dt2 <- data.table(Num = 1:5, Letter = c('A','B','C','D','E')) 我想在基于dt2的第一个数据表中添加一列,因此它将有两列: dt1 <- dt1

我在R中有两个数据表:

#install.packages("data.table")
library(data.table)
dt1 <- data.table(Num = c(1,1,1,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5))
dt2 <- data.table(Num = 1:5, Letter = c('A','B','C','D','E'))
我想在基于dt2的第一个数据表中添加一列,因此它将有两列:

dt1 <- dt1[,Letter := "THIS WILL CONTAIN AN 'A' FOR EVERY '1', 'B' FOR EVERY '2', ETC"]
第二个数据表用作另一个数据表中哪个字母对应哪个数字的键

谢谢。

我们可以在上加入使用

setkey(dt1, Num)
setkey(dt2, Num)
dt2[dt1]
    Num Letter
 1:   1      A
 2:   1      A
 3:   1      A
 4:   2      B
 5:   2      B
为了在dt1中创建字母列,我们不需要dt2

dt1[, Letter:= LETTERS[Num]]

其他答案中的方法的缺点是dt1没有更新,结果只打印到控制台。您可以通过引用更新dt1,如下所示:

dt1[dt2, lttr := Letter, on="Num"]
这将产生以下结果:

> dt1
    Num lttr
 1:   1    A
 2:   1    A
 3:   1    A
 4:   2    B
 5:   2    B
 6:   2    B
 7:   2    B
 8:   3    C
 9:   3    C
10:   3    C
11:   3    C
12:   3    C
13:   3    C
14:   4    D
15:   4    D
16:   4    D
17:   4    D
18:   4    D
19:   4    D
20:   4    D
21:   5    E
22:   5    E
23:   5    E

如果第二个数据表没有列Num作为参考,只有字母怎么办?@abbas786,在这种情况下,您可以将字母转换为数字,即as.numericfactorleters`获取序列,即dt2[,Num:=as.numericfactorLetter]然后加入或者甚至不在更新中使用dt2。我尽量不说得太具体,因为我希望最终能弄明白。我不能这样做,因为对于我的数据集,字母实际上是对应于特定数字的字符ID。所以每个1都是AFFY1,每个2都是AFFY2。我还需要将数字添加到已经有数字的数据表中,而不是将数字添加到字母中。@abbas786在这种情况下,可以使用as.numericfactor方法。如果元素与任何图案都不对应,请指定其中的级别和标签。@abbas786
> dt1
    Num lttr
 1:   1    A
 2:   1    A
 3:   1    A
 4:   2    B
 5:   2    B
 6:   2    B
 7:   2    B
 8:   3    C
 9:   3    C
10:   3    C
11:   3    C
12:   3    C
13:   3    C
14:   4    D
15:   4    D
16:   4    D
17:   4    D
18:   4    D
19:   4    D
20:   4    D
21:   5    E
22:   5    E
23:   5    E