我正在尝试在R中编写一个函数来计算给定收入和人口份额的基尼系数(收入不平等系数) . 这就是我想要做的:
incomes <- c(1175,1520,1865,2210,2555) # incomes
population <- rep(1/5,5)*100 # population shares (5 times 1/5)
income <- incomes*population/sum(incomes*population) # income * frequency / total income
data <- as.data.frame(cbind(incomes,income,population/100))
names(data) <- c("incomes","income","population")
data <- data[order(as.numeric(data$incomes)),] # sort by percentage of income
for (i in 1:length(income)){
data$richer[i] <- 1-sum(data$population[1:i])
}
data$score <- data$income * (data$population + 2 * data$richer)
gini <- round(1-sum(data$score),4) # gini
这一切都运作良好 . 但现在我想绘制收入分配图,为此我创建了一个新的数据集:
data$population2 <- data$richer + data$population # cumulative
x <- as.data.frame(matrix(data=NA,ncol=1,nrow=20))
names(x) <- c("population2")
x$population2 <- rev(seq(0.05,1,0.05))
data.graph <- join(x, data, by = "population2")
所以'data $ population2'变量的值为1,0.8,0.6,0.4,0.2,x $ population2的值为1,0.95,0.9,0.85,0.8等,直到0.05 . 但是,join函数只加入值为1,0.8,0.2,而不是0.6和0.4的值!谁能帮我吗?
1 回答
欢迎来到first circle of R hell . :)
乍一看,
data$population2
中的所有值看起来都应该在x$population2
中匹配:但事实并非如此:
以下内容适用于示例案例,但我要小心不要在每个场景中应用它,而不考虑四舍五入的小数位数是否合适 . 通常,使用字符键执行连接更安全:
作为旁注,在前面的步骤中使用for循环,您可以执行以下操作:
对于循环操作在R中相对较慢(在较大的数据集中可见) . R针对矢量化操作进行了优化 .