2015-12-02 99 views
0

我在嘗試使用裝箱的人口普查數據計算基尼係數時遇到了一些困難,並且非常感謝您的幫助。如何創建for循環來計算r中分箱數據的gini函數?

我的數據看起來有點像這樣(但有14,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) 

所以對於每個觀測有給出一個位置,然後顯示在該地區的許多家庭如何給定的收入階層(所以對位置的內獲得一系列的列,20戶獲得$ 0,13賺income1 ,27個收入2和0個收入3)。

我創建一個空欄,將結果返回給:

df$gini = 0

我然後創建(x)的含有欲用於每個收入倉

收入量的數值矢量
x <- c(0, 300, 1000, 2000) 

我一直在試圖使用reldist包內的基尼功能,並已寫入通過數據的每一行循環循環下,運用基尼功能和輸出返回到一個新列。

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

問題是返回的輸出當前對每一行都是相同的,這顯然是不正確的。我雖然比較新,但不知道我在做什麼錯...

+0

你可以提供一些數據嗎? (編輯你的問題) – jogo

+0

我現在正在更新我的答案我已經試過了這個包,你確實需要循環! – MikeRSpencer

回答

0

R矢量化操作,所以通常不需要編寫循環;在這種情況下,你是因爲函數的工作原理而做的。你也經常不需要初始化一個容器(有時你可能,但很少)。

下面是使用適用於循環遍歷行的工作示例:

# 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

+0

謝謝 - 這個作品完美無缺,也幫助我理解我做錯了什麼,爲什麼。這就是爲什麼我喜歡這個網站 - 你在眼前的問題上得到了幫助,但這也意味着你也能不斷提高你的知識和理解力。 – Sarlo

+0

更新我以前的評論:有沒有一種方法可以包括在這個權重?我的數據中的列包含每個收入(所以重量)而不是收入本身的人數...... – Sarlo

+0

也許您可以編輯您的問題以包含一些示例數據?樂於幫助,這對學習也很有幫助! – MikeRSpencer