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
答案 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 = ":"))]
您可以使用.SD
和by
来处理多个列:
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="/") })