在ddply中使用用户定义的函数计算基尼系数时出错

时间:2014-07-30 12:48:47

标签: r user-defined-functions plyr

我正在尝试使用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中引发的。有谁知道这意味着什么以及如何解决它?

1 个答案:

答案 0 :(得分:1)

问题出在fakeInflate。当向量具有5个以上的元素时,toadd可能会变为负数。请改用:

toadd <- max(0, 5 - length(x[[1]]))