【问题标题】:Using tapply on two columns instead of one在两列而不是一列上使用 tapply
【发布时间】:2013-03-01 10:04:11
【问题描述】:

我想用 R 从 reldist 包中取消 gini() 函数来计算几个图的基尼系数。 我有一个数据框,我需要从中使用两列作为 gini 函数的输入。

>  head(merged[,c(1,17,29)])
  idp c13     w
1  19 126 14.14
2  19 146 14.14
3  19  76 39.29
4  19  74 39.29
5  19  86 39.29
6  19  93 39.29

gini 函数使用第一个元素进行计算(此处为 c13),第二个元素为 c13 中每个元素对应的权重(此处为 w)。

所以我需要像这样使用列 c13 和 w:

gini(merged$c13,merged$w)
[1] 0.2959369

问题是我想为每个情节 (idp) 执行此操作。我有 4000 个不同的 idp 值,每个值都有另外两列的几十个值。

我想我可以使用函数tapply() 来做到这一点。但是我不能使用tapply在函数中放置两个列。

tapply(list(merged$c13,merged$w), merged$idp, gini)

如您所知,这是行不通的。 因此,我希望得到这样的数据框:

 idp  Gini 
1  19 0.12 
2  21 0.45
3  35 0.65
4  65 0.23

你知道怎么做吗?也许是 plyr 包? 感谢您的帮助!

【问题讨论】:

    标签: r plyr tapply


    【解决方案1】:

    您可以使用库 plyr() 中的函数 ddply() 来计算每个级别的系数(在示例数据框中将一些 idp 值更改为 21)。

    library(plyr)
    library(reldist)
    ddply(merged,.(idp),summarize, Gini=gini(c13,w))
    
      idp       Gini
    1  19 0.15307402
    2  21 0.05006588
    

    【讨论】:

    • 谢谢。我绝对需要处理这个 plyr 包。似乎充满了有趣的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多