错误:通过分位数函数

时间:2017-06-18 17:42:52

标签: r

遇到麻烦。我所拥有的是:

dec_amt <- function(x, k) format(round(x, k), nsmall=k)      # Formatting decimal places 

example.df <- data.frame(replicate(8,sample(0:100000,1000,rep=TRUE)))
names(example.df) <- c("AF", "CD", "CS", "ED", "LP", "PI", "RR", "TD")

probTab_test2 <- function(x = c(...), y=c(...), z=c(...))

{ 
  m.TABLE <- list()
  EXP <- list()
  PROB <- c(seq(.10, .90, .10), seq(.91,.99,.01), seq(.995, .999, .001))
  PERIOD <- dec_amt(1/(1-PROB), 2)

  for (i in 1:(length(z)))  { 

    if (length(z) == 1) 
    { 
      break 
    } 

    EXP <- quantile(example.df[,z[i]], PROB)
    EXP <- formatC(EXP, format='d', big.mark=',')
    m.TABLE <- list(data.frame(PERIOD, EXP))

    print(m.TABLE)
  }

  EXP <- quantile(example.df[,z], PROB)
  EXP <- formatC(EXP, format='d', big.mark=',')

  TABLE <- data.frame(PERIOD, EXP)

  return(TABLE)
}

probTab_test2(c("Consumer Products"), c("All Revenues"),c("TD", "LP"))

 Error in `[.data.frame`(x, order(x, na.last = na.last, decreasing = decreasing)) : 
  undefined columns selected 

我想要的是,如果参数z的长度是> 1然后对于z的每个元素,我希望它创建一个'EXP'列,我可以绑定到一个数据帧(定义为m.TABLE),所以最后我会有一个'z'数据帧列表。

我觉得分位数功能对于我通过数据帧而不是向量而感到高兴,但不知道如何在这个循环中解决这个问题。建议会很棒,很乐意提供进一步的信息。

注意 - 随意忽略我的x,y参数 - 这些将用于调用外部函数,但对于此问题不值得注意。

1 个答案:

答案 0 :(得分:1)

您可以使用lapply函数循环遍历z中列出的变量并简化代码:

probTab_test2 <- function(x = c(...), y=c(...), z=c(...)) { 
    PROB <- c(seq(.10, .90, .10), seq(.91,.99,.01), seq(.995, .999, .001))
    PERIOD <- dec_amt(1/(1-PROB), 2)
    m.TABLE <- lapply(as.data.frame(example.df[, z]),  function (vector) {
        quantiles <- quantile(vector, PROB)
        formatted.quantiles <- formatC(EXP, quantiles, format='d', big.mark=',')
        return(data.frame(PROB, formatted.quantiles))
  })
    return(m.TABLE)
}

对于z中列出的每个变量,此函数计算分位数并为z中列出的每个变量创建数据帧。 as.data.frame是必要的,以便lapply即使在length(z)==1时也能正常工作。