【问题标题】:How to use aggregate() over multiple columns based on condition如何根据条件在多列上使用聚合()
【发布时间】:2018-07-25 14:07:13
【问题描述】:

我想使用aggregate 根据特定条件计算多列的简单汇总指标,例如仅适用于> 0 的那些行。 subset在使用aggregate 之前对值> 0 的数据显然不起作用,因为这将删除所有列的整行,即使只出现一个零。请参阅以下代码进行说明:

idA <- c("A","A","A","A","A","B","B","B","B","B")
idB <- c("C","D","C","D","C","D","C","D","C","D")
colA <- c(0,2,3,0,0,3,9,5,6,1)
colB <- c(9,3,0,2,2,4,6,1,9,9)
colC <- c(0,0,5,7,3,9,8,1,2,3)

df <- data.frame(idA,idB,colA,colB,colC)

aggregate(.~idA+idB,df,FUN=NROW)

这种形式的aggregate 命令当然没有意义,因为所有列的行数都相同。

这是我正在寻找的结果:

idA  idB  colA  colB  colC
A    C    1     2     2
B    C    2     2     2
A    D    1     2     1
B    D    3     3     3

因此需要一个条件语句,只包括行&gt; 0。或者,我确信通过data.table 有一个聪明的方法可以做到这一点。任何帮助将不胜感激!

【问题讨论】:

  • aggregate(.~ idA + idB, df , function(x) length(x[x &gt; 0]))
  • 感谢@DavidArenburg!如果您发布您的评论作为答案,我会相应地标记它。
  • 有人已经做了然后删除了

标签: r data.table aggregate subset


【解决方案1】:

在data.table中,您可以执行以下操作:

setDT(df)
df[,lapply(.SD, function(x) sum(x > 0)),.(idA,idB), .SDcols = setdiff(names(df), c('idA','idB'))]

【讨论】:

  • 我猜length(x[x &gt; 0]) 应该与sum(x &gt; 0) 相同,除非x 包含 NA,在这种情况下它将包括那些 NA 计数(这可能是不想要的)。跨度>
猜你喜欢
  • 2021-12-01
  • 2023-03-09
  • 2020-01-14
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 2022-11-14
  • 2020-07-04
  • 2018-07-03
相关资源
最近更新 更多