我有一个像
这样的数据框> df[1:10,]
SID Group Source
1 1 10 C04
2 1 5 M04
3 1 5 M02
4 1 5 M03
5 2 40 M04
6 2 40 M02
7 2 40 M03
8 3 45 M01
9 3 40 M01
10 3 40 C01
现在我想根据SID和Group合并Source-Column。这样我得到以下输出
SID Group Source
1 1 10 {C04}
2 1 5 {M04, M02, M03}
3 2 40 {M04, M02, M03}
4 3 45 {M01}
5 3 40 {M01, C01}
...
我已经尝试过使用聚合
> y <- as.data.frame(aggregate(Source~., data=df, paste,collapse=",", na.rm=TRUE))
并根据
订购结果> y <- y[order(y$SID,-y$Group),]
几乎可以提供预期的结果
SID Group Source
1 1 10 C04 TRUE
2 1 5 M04 TRUE,M02 TRUE,M03 TRUE
3 2 40 M04 TRUE,M02 TRUE,M03 TRUE
4 3 45 M01 TRUE
但是我想在上一篇专栏文章中删除TRUE,我想知道为什么我会得到这些,我该如何避免它们呢?
有人有线索或解释吗?我感谢您的帮助。
答案 0 :(得分:1)
我们可以尝试
aggregate(Source~., df, FUN=toString)
# SID Group Source
#1 1 5 M04, M02, M03
#2 1 10 C04
#3 2 40 M04, M02, M03
#4 3 40 M01, C01
#5 3 45 M01
应该得到预期的输出
toString
是paste(., collapse=', ')
的包装器。 na.rm=TRUE
中没有paste
。因此,添加na.rm=TRUE
将添加一个新元素TRUE。 na.rm=TRUE
通常与mean
,median
等一起使用,具有该选项。例如,如果我将其与paste
aggregate(Source~., df, FUN=paste, collapse=', ', na.rm=TRUE)
# SID Group Source
#1 1 5 M04 TRUE, M02 TRUE, M03 TRUE
#2 1 10 C04 TRUE
#3 2 40 M04 TRUE, M02 TRUE, M03 TRUE
#4 3 40 M01 TRUE, C01 TRUE
#5 3 45 M01 TRUE
相反,我们可以做到
aggregate(Source~., df, FUN=function(x)
paste(x[!is.na(x)], collapse=', '))
# SID Group Source
#1 1 5 M04, M02, M03
#2 1 10 C04
#3 2 40 M04, M02, M03
#4 3 40 M01, C01
#5 3 45 M01
或data.table
library(data.table)
setDT(df)[,list(Source=toString(Source)) , .(SID, Group)]
# SID Group Source
#1: 1 10 C04
#2: 1 5 M04, M02, M03
#3: 2 40 M04, M02, M03
#4: 3 45 M01
#5: 3 40 M01, C01