【问题标题】:Create function with names from data frame使用数据框中的名称创建函数
【发布时间】:2018-03-15 04:14:24
【问题描述】:

我正在使用 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 列执行此操作,而无需键入循环遍历每一列并创建函数?

谢谢,

【问题讨论】:

    标签: r function


    【解决方案1】:

    这是一个建议,但我不确定它的效率如何。 首先,我使用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)))
    }
    

    我确信有办法让它更快,所以任何 cmets 都会非常感激。此外,鉴于您没有提供任何可重现的示例,我不能 100% 确定它会按照您希望的方式工作。

    让我知道它是否有效!

    【讨论】:

    • @MeR,我很乐意提供帮助!请考虑将其标记为已接受,以便整理“未回答”问题页面。谢谢!
    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    相关资源
    最近更新 更多