【问题标题】:How to extract a parameter from a list of functions in a loop如何从循环中的函数列表中提取参数
【发布时间】:2015-09-19 15:16:38
【问题描述】:

我有一个大型数据集,我想一次执行多个函数并为每个参数提取一个参数。

测试数据集:

testdf <- data.frame(vy = rnorm(60), vx = rnorm(60) , gvar = rep(c("a","b"), each=30))

我首先定义了一个函数列表:

require(fBasics)
normfuns <- list(jarqueberaTest=jarqueberaTest, shapiroTest=shapiroTest, lillieTest=lillieTest)

然后是通过分组变量执行测试的函数

mynormtest <- function(d) {
  norm_test <- res_reg <- list()
  for (i in c("a","b")){
    res_reg[[i]] <- residuals(lm(vy~vx, data=d[d$gvar==i,]))
    norm_test[[i]] <- lapply(normfuns, function(f) f(res_reg[[i]]))  
  }
  return(norm_test) 
}

mynormtest(testdf)

我获得了每个分组变量的测试摘要列表。 但是,我只对获取参数“STATISTIC”感兴趣,但我没有设法找出如何提取它。

【问题讨论】:

    标签: r function for-loop statistics extract


    【解决方案1】:

    您可以在各种测试的输出中获取存储为“STATISTIC”的值

    res_list <- mynormtest(testdf)
    res_list$a$shapiroTest@test@statistic
    res_list$a$jarqueberaTest@test@statistic
    res_list$a$lillieTest@test@statistic
    

    相应地对于集合b:

    res_list$b$shapiroTest@test$statistic
    res_list$b$jarqueberaTest@test$statistic
    res_listb$lillieTest@test$statistic
    

    希望这会有所帮助。

    【讨论】:

    • 非常感谢。我将尝试在 for 循环中添加此代码,例如获取具有组 x 统计信息的表。欢迎任何建议
    • 速度不是问题,但我有一个大型数据集,其中包含许多级别的分组变量和一些要计算的测试。因此,仅使用有趣的参数获得简洁的结果会很好。我尝试使用第二个功能进行改进(请参阅下面的答案),现在我想将两者结合起来,可能使用 lapply。
    【解决方案2】:

    关于你的功能fgetparam 我认为这是一个很好的起点。以下是我的建议,稍作修改:

    getparams2 <- function(myp) {
      m <- matrix(NA, nrow=length(myp), ncol=3)
      for (i in (1:length(myp))){
        m[i,] <- sapply(1:3,function(x) myp[[i]][[x]]@test$statistic)}
      return(m)
    }
    

    这个函数代表了一个小的概括,因为它允许任意数量的观察,而在你的情况下,这被固定为两种情况,a 和 b。代码当然可以进一步缩短,但它也可能变得更加神秘。我相信,在开发代码时,一方面在效率和紧凑性与另一方面的可读性或易理解性之间保持某种折衷是有帮助的。

    编辑

    作为@akrun 和@Roland 的pointed out,函数getparams2() 可以写成更优雅、更短的形式。一种可能是

    getparams2 <- function(myp) {
        matrix(unname(rapply(myp, function(x) x@test$statistic)),ncol=3)}
    

    另一个不错的选择是

    getparams2 <- function(myp){t(sapply(myp, sapply, function(x) x@test$statistic))}
    

    【讨论】:

    • 太好了,感谢您提供的有用的概括。
    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 2016-10-11
    • 2018-02-15
    • 1970-01-01
    • 2021-06-23
    • 2018-02-18
    • 1970-01-01
    • 2016-09-07
    相关资源
    最近更新 更多