使用数据框中的名称创建函数

时间:2018-03-14 17:57:37

标签: r function

我正在使用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列,是否有一种很好的方法可以执行此操作,而无需在每列中键入循环并创建函数?

谢谢,

1 个答案:

答案 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%确定它是否按您希望的方式工作。

让我知道它是否有效!