【问题标题】:How do I aggregate on over the subset and return one value?如何聚合子集并返回一个值?
【发布时间】:2013-02-18 17:04:17
【问题描述】:

我有一个如下数据集:

id tag x y z
1  "A" 1 2 3
2  "B" 0 2 4
3  "A" 0 0 1
4  "B" 1 3 4

我有一个函数agg,它取tag分组的子集,即参数为:

id tag x y z
1  "A" 1 2 3
3  "A" 0 0 1

假设agg 是子集中所有x y z 的简单总和,因此对于tag=="A" 的子集给出7 的结果。

所以我想要的是这样的最终结果:

"A" 7
"B" 14
...

我可以列出tag 的所有值并循环它们以获取单个子集,然后将其提供给函数。有没有更好的办法?我猜肯定有一些图书馆可以很好地做到这一点..

编辑:我已更改问题以提供更好的描述。希望这次我说清楚了。

我认为我遇到的困难是聚合函数需要整个子集来产生一个值,而普通聚合函数(平均值、长度等)从子集中获取一个变量。

【问题讨论】:

  • 你能举一个可重现的例子吗?
  • 正如您所提到的,有多种方法可以“聚合”数据,但是您在寻找哪种聚合方式?一笔?一个平均值?条目数?

标签: r aggregate aggregation


【解决方案1】:

我认为您想使用 reshape2 进行整形。 . .

library(reshape2)
df <- read.table(
  header=TRUE, text='
id tag x y z
1  "A" 1 2 3
2  "B" 0 2 4
3  "A" 0 0 1
4  "B" 1 3 4
')
df[,1]<- NULL
df2<- melt(df, id="tag")
dcast(df2, tag~., sum)

#  tag NA
#1   A  7
#2   B 14

【讨论】:

    【解决方案2】:
    ds <- read.table(text='id tag x y z
     1  "A" 1 2 3
     2  "B" 0 2 4
     3  "A" 0 0 1
     4  "B" 1 3 4', header=TRUE)
    
    lapply(split(ds[c('x','y','z')], ds$tag), sum)
    $A
    [1] 7
    
    $B
    [1] 14
    

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 2019-10-08
      • 2014-01-25
      • 2020-07-18
      • 2015-08-26
      • 1970-01-01
      • 2021-02-16
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多