我正在使用GAMLSS的fitDist来分配我的数据帧中的120列中的每一列,如下所示:
my_list <- list()
for (i in 1: ncol(df)) {
my_list[[i]] <- fitDist(df[,i], type = "realAll")
}
现在假设第一个拟合分布是GG(广义Gamma),我创建函数:
colname <- function(p) qGG(p, ...)
以下是我的问题:对于数据帧的所有120列,是否有一种很好的方法可以执行此操作,而无需在每列中键入循环并创建函数?
谢谢,
答案 0 :(得分:0)
这是一个建议,但我不确定它的效率如何。
首先,我使用lapply
而不是for
循环来创建列表。
my_list<- lapply(df, function(x) fitDist(x, type = "realAll"))
然后我通过做很多字符串操作来修改你的函数,这样我们就可以达到预期的结果。主要思想是从my_list
,我们提取相关信息,即分布和参数,然后用该信息创建一个字符串,最后我们执行它。
colname<- function(p, my_list){
functions<- sapply(my_list, function(x) names(x$fits[1]))
inputs<- lapply(my_list, function(x) x$parameters)
parameters<- lapply(seq_along(1:length(inputs)), function(x) my_list[[x]][inputs[[x]]]))
arguments<- lapply(parameters, function(x) paste0(names(x), "=", x))
name<- sapply(seq_along(1:length(functions)), function(x) paste0("q", functions[x], "(", paste(p, paste(arguments[[x]], collapse=","), sep=","),")", sep=""))
colname<- sapply(name, function(x) eval(parse(text = x)))
}
我确信有办法让它更快,所以任何评论都会非常感激。另外,鉴于您没有提供任何可重复的示例,我无法100%确定它是否按您希望的方式工作。
让我知道它是否有效!