我正在尝试使用ddply来生成几组观察的基尼系数。我的数据看起来像这样:(这显然是人为的)
Group Name Month Wage
A Alice January 0
A Alice February 300
A Alice February 400
B Alice March 500
B Bob January 1000
B Bob January 2500
我想获得工资的基尼系数,按组,名称和月份分组。现在,我有以下代码。它使用用户定义的函数进行计算,因为我需要在将数据发送到gini之前稍微修改一下。还有我发现here的用户定义的gini函数,因为标准的ineq函数对我来说并不正常。
#add up to 5 0's if there are not enough observations
fakeinflate <- function(x)
{
toadd <- 5 - length(x[[1]])
add <- rep(0, toadd)
togin <- c(x$wage, add)
g <- ineq(togin)
return(g)
}
#calculate the Gini coefficient
gini <- function(x, unbiased = TRUE, na.rm = FALSE){
if (!is.numeric(x)){
warning("'x' is not numeric; returning NA")
return(NA)
}
if (!na.rm && any(na.ind <- is.na(x)))
stop("'x' contain NAs")
if (na.rm)
x <- x[!na.ind]
n <- length(x)
mu <- mean(x)
N <- if (unbiased) n * (n - 1) else n * n
ox <- x[order(x)]
dsum <- drop(crossprod(2 * 1:n - n - 1, ox))
dsum / (mu * N)
}
#aggregate with ddply
allginis <- ddply(allwagesdf, c("Group", "Name"), fakeinflate)
当我运行此操作时,我收到以下错误:&#39;错误:无效&#39;次&#39;参数&#39 ;.我已经尝试过调试,我的功能似乎运行正常 - 错误是在ddply中引发的。有谁知道这意味着什么以及如何解决它?
答案 0 :(得分:1)
问题出在fakeInflate
。当向量具有5个以上的元素时,toadd
可能会变为负数。请改用:
toadd <- max(0, 5 - length(x[[1]]))