【问题标题】:Calculate proportions within subsets of a data frame计算数据框子集内的比例
【发布时间】:2013-02-21 17:52:31
【问题描述】:

我正在尝试获取数据框子集内的比例。例如,在这个虚构的数据框中:

DF<-data.frame(category1=rep(c("A","B"),each=9),
    category2=rep(rep(LETTERS[24:26],each=3),2),
     animal=rep(c("dog","cat","mouse"),6),number=sample(18))

我想通过category2 组合计算每个category1 的三种动物的比例(例如,在所有“A”和“X”的动物中,狗的比例是多少? )。在数据框的第 4 列使用prop.table,我可以获得每一行在总“数字”列中的比例,但我还没有找到一种方法来为基于类别 1 和 2 的子集执行此操作。我也尝试使用 category1category2 拆分数据:

splitDF<-split(DF,list(DF$category1,DF$category2))

然后我希望我可以使用prop.table 应用一个函数来获取每个分组中每只动物的比例,但我无法让prop.table 工作,因为我似乎无法指定哪一列数据将功能应用于拆分组内。有没有人有任何提示?也许plyr 或类似的东西可以做到这一点?我在帮助论坛中找不到任何关于在数据子集中获取比例的方法。

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    您可以使用库 plyr 中的函数 ddply() 计算每个组合的比例,然后将新列添加到数据框。

     library(plyr)     
     DF<-ddply(DF,.(category1,category2),transform,prop=number/sum(number))
     DF
       category1 category2 animal number       prop
    1          A         X    dog     17 0.44736842
    2          A         X    cat      3 0.07894737
    3          A         X  mouse     18 0.47368421
    4          A         Y    dog      2 0.14285714
    

    【讨论】:

    • 这真的很好很干净。非常感谢,迪兹! plyr 似乎可以解决很多此类问题,但我需要一段时间才能习惯!
    • 抱歉删除了这篇文章 - 你能解释一下'。'跟随“DF”?
    • @ReputableMisnomer .() 变量周围的语法用于允许变量名不带引号。请参阅函数 ddply 的帮助文件(示例部分)。
    【解决方案2】:

    这会产生你想要的输出吗?

     DF$proportion<-as.vector(unlist(tapply(DF$number,paste(DF$category1,DF$category2,sep="."),FUN=function(x){x/sum(x)})));
    

    【讨论】:

    • 是的,确实如此(就像 Didzis 使用 plyr 的回答一样)。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2013-09-27
    相关资源
    最近更新 更多