我有一个包含许多变量的大数据集,看起来与此类似:
> 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)
您可以在使用中连接所有列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)