使用`data.table`粘贴两个字符列

时间:2017-03-27 18:58:08

标签: r data.table

这个问题是对paste two data.table columns的跟进,因此我会使用相同的例子:

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

我想创建一个新列,它是两列的组合,dt$Adt$B

dt[, new := paste0(A, B)]
dt
   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

由于我使用new作为一种ID列,并且更喜欢某些人类可读性,我想使用一个字符来分隔dt$A和{{1}的内容所以:

dt$B

但这会意外地改变这种行为:

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

2 个答案:

答案 0 :(得分:0)

以上是>>> rm_sub('abcdc.me','.me') 'abcdc' 的预期行为 - 实现上述目标的解决方案实际上是paste0

创建列paste作为newdt$A的串联以及用于分隔内容的字符,请使用dt$B代替paste

paste0

例如,将dt <- data.table(L=1:5,A=letters[7:11],B=letters[12:16]) dt[ , new := paste(A, B, collapse = ".")] dt L A B new 1: 1 g l g.l 2: 2 h m h.m 3: 3 i n i.n 4: 4 j o j.o 5: 5 k p k.p paste0一起使用,更改collapse = "."的输出,如文档概述:

如果为 paste0指定了值,那么结果中的值将连接成一个字符串,其中的元素由 collapse

答案 1 :(得分:0)

只需使用sep作为paste()的参数,而不是collapse

dt[, new := paste(A, B, sep = ".")]
dt
#   L A B new
#1: 1 g l g.l
#2: 2 h m h.m
#3: 3 i n i.n
#4: 4 j o j.o
#5: 5 k p k.p

paste0()并不尊重sep参数(请参阅?paste0)。