首页 文章

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

提问于
浏览
0

我想计算几个图的基尼系数,其中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)做这个 . 我有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 回答

  • 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
    

相关问题