粘贴两个data.table列

beg*_*neR 11 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
Run Code Online (Sandbox Code Playgroud)

现在我想粘贴"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
Run Code Online (Sandbox Code Playgroud)

dnl*_*rky 15

我有一个类似的问题,但有很多列,并不想手动键入它们.

新版本

(根据@mnel的评论)

dt[, new:=do.call(paste0,.SD), .SDcols=-1]
Run Code Online (Sandbox Code Playgroud)

这大约是旧版本的两倍,并且似乎回避了这个怪癖.请注意.SDcols用于标识要使用的列paste0.该-1应用中的所有列,但首先,由于OP要粘贴列A和B,但没有L.

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

dt[ , new := do.call(paste, c(.SD, sep = ":"))]
Run Code Online (Sandbox Code Playgroud)

旧版

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

dt[,new:=paste0(.SD,collapse=""),by=seq_along(L)]
Run Code Online (Sandbox Code Playgroud)

我添加seq_along以防L不是唯一的.(你可以用它来检查dt<-data.table(L=c(1:4,4),A=letters[7:11],B=letters[12:16])).

另外,在我的实际例子中由于某种原因我不得不t(.SD)paste0部分中使用.可能还有其他类似的怪癖.


beg*_*neR 13

Arun的评论回答了这个问题:

dt[,new:=paste0(A,B)]
Run Code Online (Sandbox Code Playgroud)

  • 这是我用于非常类似任务的精确方法,但是我决定使用选项`collapse ="."`因为我使用结果列,`new`,作为各种ID,并添加了`collapse =`选项意外地改变了行为 - 在一个相当大的`data.table`它实际上冻结了R - 这实际上是预期的行为还是一个错误?即:`dt [,new:= paste0(A,B,collapse ="."]`,它在本例中使用的样本表上产生以下内容:`lgl lh mi nj ok p` (3认同)