为什么我在聚合函数中得到 TRUE 以及如何删除/避免它? (右)
Why do I get TRUE in my aggregated function and how do I remove / avoid it? (R)
我有一个像
这样的数据框
> 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,我想知道为什么会得到这些以及如何避免它们?
有人有线索或解释吗?我感谢您的帮助。
我们可以试试
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=', ')
的包装器。 paste
里面没有na.rm=TRUE
。所以添加 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
我有一个像
这样的数据框> 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,我想知道为什么会得到这些以及如何避免它们?
有人有线索或解释吗?我感谢您的帮助。
我们可以试试
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=', ')
的包装器。 paste
里面没有na.rm=TRUE
。所以添加 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