【问题标题】:data table string concatenation of SD columns for by group values按组值连接 SD 列的数据表字符串
【发布时间】:2015-06-03 13:00:57
【问题描述】:

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

 > 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: aggregating strings within column, across rows, by group,它讨论了如何为一列执行此操作,如何将其扩展到 .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

【问题讨论】:

  • 你想要的输出不清楚。
  • 大卫 - 我改变了我原来的问题,使所需的输出清晰

标签: r data.table


【解决方案1】:

您可以使用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

使用换行符作为 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

正如@Frank 在 cmets 中指出的那样,问题已更改为将 , 作为分隔符,而不是 \n。当然,您可以将collapse 参数更改为","。如果您也想拥有空间", ",那么@DavidArenburg 的解决方案更可取。

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

【讨论】:

  • OP 将折叠字符更改为逗号
  • toSTring 然后 ;) dt[, lapply(.SD, toString), by = ID]。很高兴看到影子终于发布了一些 data.table 解决方案,而不仅仅是 dplyr :)
  • 大卫和弗兰克 - 感谢您的解决方案,它们很有用。在 lapply 中,我们可以使用 catpaste 在连接值之间使用 \n 字符获得所需的结果吗?
  • 我认为这不可能。但如果您想确认(或最好不确认),我会问一个新问题。
  • shadow- 谢谢,这是我最初的问题和想要的输出,我将分隔符更改为 , 以回应大卫的评论 desired output is unclear,我会进一步研究 - 再次感谢
猜你喜欢
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2021-10-05
相关资源
最近更新 更多