遇到麻烦。我所拥有的是:
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参数 - 这些将用于调用外部函数,但对于此问题不值得注意。
答案 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
时也能正常工作。