【问题标题】:Paste two character columns with `data.table`用 `data.table` 粘贴两个字符列
【发布时间】:2017-03-27 18:58:08
【问题描述】:

这个问题是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$Adt$B 的内容,所以:

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

但这意外地改变了行为:

dt
   L A B            new
1: 1 g l gl.hm.in.jo.kp
2: 2 h m gl.hm.in.jo.kp
3: 3 i n gl.hm.in.jo.kp
4: 4 j o gl.hm.in.jo.kp
5: 5 k p gl.hm.in.jo.kp

【问题讨论】:

  • 你为什么用collapse而不是sep

标签: r data.table


【解决方案1】:

只需使用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)。

【讨论】:

  • 我们如何在上面示例的粘贴中使用具有列名的外部变量?例如cols_to_paste = c("A", "B") 然后是dt[, new := paste(cols_to_paste, sep = ".")]
【解决方案2】:

以上是paste0的预期行为——实现上述的解决方案实际上是paste

new 列创建为dt$Adt$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

例如,将paste0collapse = "." 结合使用,会更改paste0 的输出,如文档所述:

如果为 collapse 指定了一个值,结果中的值随后会连接成一个字符串,其中元素由 @ 的值分隔987654333@.

【讨论】:

  • 刚刚查看了paste0/paste 的帮助,这似乎符合预期:如果为collapse 指定了一个值,那么结果中的值就是连接成一个字符串,元素由collapse的值分隔.
猜你喜欢
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2021-04-20
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多