簡體   English   中英

如何從循環中的函數列表中提取參數

[英]How to extract a parameter from a list of functions in a loop

我有一個大數據集,我想一次執行幾個函數並為每個參數提取一個參數。

測試數據集:

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”感興趣,我沒有設法找出如何提取它。

您可以使用以下命令在各種測試的輸出中獲取存儲為“ 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

希望這可以幫助。

關於函數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所指出的那樣 ,函數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))}

我編寫了第二個函數以矩陣形式獲取統計信息。 理想情況下,我想將兩個功能結合在一起。 我考慮過愉快,但尚未找到解決方案。

fgetparam <- function(myp){
  p_mat <- matrix(NA, nrow=2, ncol=3)
  for(i in 1:2){
    for(j in 1:3 ){
      p_mat[i,j] <- myp[[i]][[j]]@test$statistic
    }
  }
  return(p_mat)
}

fgetparam(res_list)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM