13
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

4 回答 4

22

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

新版本

(基于@mnel 的评论)

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

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

如果您想使用不同的分隔符:

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

旧版

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

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部分中使用。可能还有其他类似的怪癖。

于 2014-05-23T00:23:14.290 回答
17

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

dt[,new:=paste0(A,B)]
于 2013-08-21T14:25:13.907 回答
-1

这应该这样做:

 dt <- data.table(dt, new = paste(dt$A, dt$B, sep = ""))
于 2013-08-21T14:06:13.577 回答
-3

如果您想严格使用列索引粘贴(当您可能不知道行名时)...我想通过粘贴两列 6 和 4 来获得一个新列

dt$new <- apply( dt[,c(6,4)], 1, function(row){ paste(row[1],row[2],sep="/") })
于 2016-09-18T22:17:03.397 回答