数据表字符串串联值的SD列串联

Sri*_*Sri 4 r data.table

我有一个包含许多变量的大数据集,看起来与此类似:

 > data.table(a=letters[1:10],b=LETTERS[1:10],ID=c(1,1,1,2,2,2,2,3,3,3))
     a b ID
  1: a A  1
  2: b B  1
  3: c C  1
  4: d D  2
  5: e E  2
  6: f F  2
  7: g G  2
  8: h H  3
  9: i I  3
 10: j J  3
Run Code Online (Sandbox Code Playgroud)

我想连接(在它们之间使用新的行字符)所有列值除ID以外的每个ID值,因此结果应如下所示:

     a b ID
  1: a A  1
     b B   
     c C   
  2: d D  2
     e E   
     f F   
     g G   
  3: h H  3
     i I   
     j J   
Run Code Online (Sandbox Code Playgroud)

我找到了一个链接R Dataframe:聚合列中的字符串,跨行,按组讨论如何为一列执行此操作,如何为.SD中的所有列扩展此字符串?

为了清楚起见我将分隔符更改\n,,结果应如下所示:

   a       b       ID
1: a,b,c   A,B,C   1
2: d,e,f,g D,E,F,G 2
3: h,i,j   H,I,J   3
Run Code Online (Sandbox Code Playgroud)

sha*_*dow 7

您可以在使用中连接所有列lapply.

dt[, lapply(.SD, paste0, collapse=" "), by = ID]
##    ID       a       b
## 1:  1   a b c   A B C
## 2:  2 d e f g D E F G
## 3:  3   h i j   H I J
Run Code Online (Sandbox Code Playgroud)

使用换行符作为ollapse参数而不是" "工作,但不会像您期望的输出那样打印.

dt[, lapply(.SD, paste0, collapse="\n"), by = ID]
##    ID          a          b
## 1:  1    a\nb\nc    A\nB\nC
## 2:  2 d\ne\nf\ng D\nE\nF\nG
## 3:  3    h\ni\nj    H\nI\nJ
Run Code Online (Sandbox Code Playgroud)

正如@Frank的评论所指出的那样,这个问题已被改为以,分隔符代替\n.当然你可以改变collapse参数",".如果你想拥有一个空间", ",那么@DavidArenburg的解决方案更可取.

dt[, lapply(.SD, paste0, collapse=","), by = ID]
dt[, lapply(.SD, toString), by = ID]
Run Code Online (Sandbox Code Playgroud)

  • `toSTring` then;)`dt [,lapply(.SD,toString),by = ID]`.很高兴看到影子终于发布了一些`data.table`解决方案,而不仅仅是`dplyr` :) (4认同)