在两列而不是一列上使用tapply

时间:2013-03-01 10:04:12

标签: r plyr tapply

我想计算几个图的基尼系数,其中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),第二个元素是权重(此处为w),对应于c13中的每个元素。

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

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

我想为每个情节(idp)做这件事。我有4千个不同的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包? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

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

library(plyr)
library(reldist)
ddply(merged,.(idp),summarize, Gini=gini(c13,w))

  idp       Gini
1  19 0.15307402
2  21 0.05006588