【问题标题】:Finding proportions based on data.frame subsets根据 data.frame 子集查找比例
【发布时间】:2013-05-16 13:19:10
【问题描述】:

我有一组来自三个维度的数据的计数:

df <- data.frame(type = c("A", "B", "B", "A", "A", "C", "B", "C"), group = c("Tp", "Tp", "Tp", "Tp", "Fc", "Fc", "Fc", "Fc"), size = c(10,20,30,40,10,20,30,40), count = c(1, 4, 2, 3, 2, 10, 2, 3))

  type group size count
1    A    Tp   10     1
2    B    Tp   20     4
3    B    Tp   30     2
4    A    Tp   40     3
5    A    Fc   10     2
6    C    Fc   20    10
7    B    Fc   30     2
8    C    Fc   40     3

我想找出每个计数占类型和组维度的子集的比例。也就是说,例如,在组“Tp”和类型“A”中的大小为 10 的部分是什么?

我认为可能有一个类似于aggregateplyr 包中的函数,但会根据子集计算每行的数据,但我似乎找不到它。我最大的努力是使用 apply:

df$prop <- apply(df, 1, function(x) as.numeric(x["count"])/sum(df[df$type==x["type"] & df$group==x["group"], "count"]))

  type group size count      prop
1    A    Tp   10     1 0.2500000
2    B    Tp   20     4 0.6666667
3    B    Tp   30     2 0.3333333
4    A    Tp   40     3 0.7500000
5    A    Fc   10     2 1.0000000
6    C    Fc   20    10 0.7692308
7    B    Fc   30     2 1.0000000
8    C    Fc   40     3 0.2307692

我只是想知道是否有更简单的方法可以做到这一点?如果没有,我会将其编写为自定义函数。

谢谢。

【问题讨论】:

  • 您对df 的定义缺少大小列。

标签: r dataframe plyr apply


【解决方案1】:

试试:

transform(df, prop=count/ave(count, type, group, FUN=sum))

【讨论】:

  • 所以我缺少的功能是ave。我也从未使用过transform,但看起来它只是节省了一点打字时间。谢谢!
【解决方案2】:

使用 plyr,

ddply(df, c("type","group"), mutate, prop = count/sum(count))

  type group size count      prop
1    A    Fc   10     2 1.0000000
2    A    Tp   10     1 0.2500000
3    A    Tp   40     3 0.7500000
4    B    Fc   30     2 1.0000000
5    B    Tp   20     4 0.6666667
6    B    Tp   30     2 0.3333333
7    C    Fc   20    10 0.7692308
8    C    Fc   40     3 0.2307692

【讨论】:

    【解决方案3】:

    更好的缩放和更直观的 imo data.table 方式:

    library(data.table)
    dt = data.table(df)
    
    dt[, prop := count/sum(count), by = list(type, group)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多