为什么我在聚合函数中得到TRUE,如何删除/避免它? (R)

时间:2016-01-22 11:36:46

标签: r join merge aggregate paste

我有一个像

这样的数据框
> 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,我想知道为什么我会得到这些,我该如何避免它们呢?

有人有线索或解释吗?我感谢您的帮助。

1 个答案:

答案 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

应该得到预期的输出

toStringpaste(., collapse=', ')的包装器。 na.rm=TRUE中没有paste。因此,添加na.rm=TRUE将添加一个新元素TRUE。 na.rm=TRUE通常与meanmedian等一起使用,具有该选项。例如,如果我将其与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