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
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
我有一个类似的问题,但有很多列,并且不想手动输入它们。
(基于@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
andby
来处理多个列:
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
部分中使用。可能还有其他类似的怪癖。
Arun 的评论回答了这个问题:
dt[,new:=paste0(A,B)]
这应该这样做:
dt <- data.table(dt, new = paste(dt$A, dt$B, sep = ""))
如果您想严格使用列索引粘贴(当您可能不知道行名时)...我想通过粘贴两列 6 和 4 来获得一个新列
dt$new <- apply( dt[,c(6,4)], 1, function(row){ paste(row[1],row[2],sep="/") })