如何创建for循环来计算r中分箱数据的gini函数?
How to create for loop to calculate gini function for binned data in r?
我在尝试使用分箱的人口普查数据计算基尼系数时遇到了一些困难,非常感谢您的帮助。
我的数据看起来有点像这样(但是有 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 income2, 0 income3).
我创建了一个空列来 return 结果:
df$gini = 0
然后我创建了一个数值向量 (x),其中包含我想用于每个收入区间的收入金额
x <- c(0, 300, 1000, 2000)
我一直在尝试使用 reldist 包中的 gini 函数,并编写了以下 for 循环来循环遍历每一行数据,应用 gini 函数并将输出 return新专栏。
for (i in 1:nrow(samp)){
w <- samp[i,2:5]
df$gini <- gini(x, w=rep(1, length=length(x)))
}
问题是输出 returned 当前每一行都是相同的,这显然是不正确的。虽然我对此比较陌生,但不确定我做错了什么......
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.
我在尝试使用分箱的人口普查数据计算基尼系数时遇到了一些困难,非常感谢您的帮助。
我的数据看起来有点像这样(但是有 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 income2, 0 income3).
我创建了一个空列来 return 结果:
df$gini = 0
然后我创建了一个数值向量 (x),其中包含我想用于每个收入区间的收入金额
x <- c(0, 300, 1000, 2000)
我一直在尝试使用 reldist 包中的 gini 函数,并编写了以下 for 循环来循环遍历每一行数据,应用 gini 函数并将输出 return新专栏。
for (i in 1:nrow(samp)){
w <- samp[i,2:5]
df$gini <- gini(x, w=rep(1, length=length(x)))
}
问题是输出 returned 当前每一行都是相同的,这显然是不正确的。虽然我对此比较陌生,但不确定我做错了什么......
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.