粘贴两个data.table列

时间:2013-08-21 13:58:15

标签: r data.table

dt <- data.table(L=1:5,A=letters[7:11],B=letters[12:16])
   L A B
1: 1 g l
2: 2 h m
3: 3 i n
4: 4 j o
5: 5 k p

现在我要粘贴“A”和“B”列来获取一个新列,我们称之为“新”:

dt2
   L A B new
1: 1 g l  gl
2: 2 h m  hm
3: 3 i n  in
4: 4 j o  jo
5: 5 k p  kp

4 个答案:

答案 0 :(得分:14)

我有类似的问题,但有很多列,并且不想手动输入它们。

新版本

(根据@mnel的评论)

dt[, new:=do.call(paste0,.SD), .SDcols=-1]

这大约是旧版本的两倍,似乎回避了这个怪癖。请注意使用.SDcols标识要在paste0中使用的列。 -1使用所有列,但第一列,因为OP想要粘贴列A和B而不是L。

如果您想使用其他分隔符:

dt[ , new := do.call(paste, c(.SD, sep = ":"))]

旧版

您可以使用.SDby来处理多个列:

dt[,new:=paste0(.SD,collapse=""),by=seq_along(L)]

我添加seq_along以防L不唯一。 (您可以使用dt<-data.table(L=c(1:4,4),A=letters[7:11],B=letters[12:16]))进行检查。

此外,在我的实际情况中出于某种原因,我必须在t(.SD)部分使用paste0。可能还有其他类似的怪癖。

答案 1 :(得分:13)

Arun's comment回答了这个问题:

dt[,new:=paste0(A,B)]

答案 2 :(得分:-2)

这应该这样做:

 dt <- data.table(dt, new = paste(dt$A, dt$B, sep = ""))

答案 3 :(得分:-3)

如果要严格使用列索引进行粘贴(当您可能不知道行名称时)... 我想通过粘贴两列6和4

来获得一个新列
dt$new <- apply( dt[,c(6,4)], 1, function(row){ paste(row[1],row[2],sep="/") })