按组值对SD列进行数据表字符串连接

7

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

 > 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

我希望你能为每个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   

我发现了一个链接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

您的期望输出不明确。 - David Arenburg
David - 我修改了原来的问题以使期望输出更为明确。 - Sri
1个回答

13
你可以使用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
使用换行符作为折叠参数而不是" "确实有效,但它不会像您在所需输出中期望的那样打印。
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

正如@Frank在评论中指出的那样,问题已经被更改为使用,作为分隔符而不是\n。当然,你可以将collapse参数更改为","。如果你还想加入一个空格", ",那么@DavidArenburg的解决方案更可取。

dt[, lapply(.SD, paste0, collapse=","), by = ID]
dt[, lapply(.SD, toString), by = ID]

OP 把折叠字符改成了逗号。 - Frank
4
toSTring然后 ;) dt[, lapply(.SD, toString), by = ID]。很高兴看到Shadow最终也发布了一些data.table的解决方案,而不仅仅是dplyr :) - David Arenburg
David和Frank - 感谢你们的解决方案,它们很有用。在lapply中,我们可以使用catpaste一起使用,以获取所需的结果,并在连接的值之间使用\n字符吗? - Sri
1
我认为这是不可能的。但如果您想得到确认(或最好不要得到确认),我可以帮您提出一个新问题。 - shadow
影子-谢谢,那是我的原始问题和期望的输出,我改变了分隔符为,以响应David的评论,因为“期望的输出不清楚”,我会进一步研究-再次感谢。 - Sri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接