如何创建for循环来计算r中{}

时间:2015-12-02 10:23:58

标签: r for-loop binning gini

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

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

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函数并将输出返回到新列。 / p>

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

问题是返回的输出目前每行都是相同的,这显然是不正确的。我虽然相对较新,但不确定我做错了什么......

1 个答案:

答案 0 :(得分:0)

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