【问题标题】:How to create for loop to calculate gini function for binned data in r?如何创建for循环来计算r中分箱数据的gini函数?
【发布时间】:2016-03-06 13:09:19
【问题描述】:

我在尝试使用合并的人口普查数据计算基尼系数时遇到了一些困难,非常感谢任何帮助。

我的数据看起来有点像这样(但有 13 个变量的 14,000 次观察)。

location <- c('A','B','C', 'D', 'E', 'F')  
no_income <- c(20, 1, 40, 79, 12, 2)
income1 <- c(13, 4, 56, 17, 9, 4)
income2 <- c(27, 39, 49, 12, 19, 0)
income3 <- c(0, 1, 4, 3, 27, 0)

df <- data.frame(location, no_income, income1, income2, income3)

因此,对于每个观察,都有一个给定的位置,然后是一系列列,表示该地区有多少家庭在给定的收入范围内赚取收入(因此对于位置 A,20 个家庭赚取 0 美元,13 个家庭赚取收入 1,27 个家庭赚取收入 2,和 0 收入3)。

我创建了一个空列来将结果返回到:

df$gini = 0

然后我创建了一个数字向量 (x),其中包含我想用于每个收入箱的收入金额

x <- c(0, 300, 1000, 2000)

我一直在尝试使用 reldist 包中的 gini 函数,并编写了以下 for 循环来循环遍历每一行数据,应用 gini 函数并将输出返回到新列。

for (i in 1:nrow(samp)){ 
     w <- samp[i,2:5] 
     df$gini <- gini(x, w=rep(1, length=length(x)))
     }

问题是当前返回的输出对于每一行都是相同的,这显然是不正确的。不过我对此比较陌生,不确定我做错了什么......

【问题讨论】:

  • 你能提供一些数据吗? (编辑您的问题)
  • 我正在更新我的答案我已经尝试了这个包,你确实需要循环!

标签: r for-loop binning gini


【解决方案1】:

R 向量化操作,因此通常不需要编写循环;在这种情况下,您这样做是因为该功能的工作方式。您也不需要经常初始化容器(有时可能,但很少)。

这是一个使用 apply 循环遍历行的工作示例:

# setup
install.packages("reldist")
library(reldist)

# dummy data
df = data.frame(ID=letters,
    Bin1=rpois(26, 3),
    Bin2=rpois(26, 8),
    Bin3=rpois(26, 1))

inc = c(0, 300, 1000)

# new column with gini
df$gini = apply(df[, 2:4], 1, function(i){
    gini(inc, i)
})

值得注意的是,gini()weights 参数默认为 =rep(1, length=length(x)),因此如果这是您想要的,则无需定义它。

编辑: 根据我在手册中阅读的内容,我添加了权重:https://cran.r-project.org/web/packages/reldist/reldist.pdf

【讨论】:

  • 谢谢你 - 这非常有效,也真的帮助我理解我做错了什么以及为什么。这就是我喜欢这个网站的原因 - 您可以在眼前的问题上获得帮助,但在某种程度上,您也可以不断提高自己的知识和理解力。
  • 更新我之前的评论:有没有办法在其中包含权重?我的数据中的列包含拥有每项收入的人数(所以重量)而不是收入本身......
  • 也许您可以编辑您的问题以包含一些示例数据?乐于助人,对学习也有好处!
  • 添加了示例数据。再次感谢。
  • 我尚未对其进行测试,但这应该足以让您启动和运行。
猜你喜欢
  • 2020-07-18
  • 2017-10-20
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 2020-08-12
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多