2015-07-03 6 views
0

У меня есть список с довольно сложной структурой, из которой я хочу извлечь только несколько конкретных значений. Поскольку dput вывод данных и структуры списка представляется проблематичным в этом случае, я воспроизвожу здесь код posted yesterday от @ user34771, который был использован для создания этого списка:Ищете более элегантный способ заполнения матрицы конкретными значениями из списка

set.seed(123) 
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) 
} 
res_list <- mynormtest(testdf) 

Для данных в res_list , у меня есть функция, которая извлекает значения, которые я заинтересован и хранит их в матрице:

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) 
} 

Эта функция обеспечивает желаемый результат.

> getparams2(res_list) 
      [,1]  [,2]  [,3] 
[1,] 0.9917054 0.9670860 0.08837058 
[2,] 0.1421776 0.9806379 0.12619274 

Однако, я не доволен стилем функции getparams2() с его FOR цикла. Я был бы рад узнать, может ли эта функция быть написана в более элегантной и более компактной форме. Спасибо за помощь.

+0

Я редактировал пост. Надеюсь, он воспроизводится сейчас. – RHertel

+1

Возможно, 'igname (rapply (res_list, function (x) x @ test $ statistic))' – akrun

+1

Спасибо, я думаю, что функция Роланда больше соответствует вашему ожидаемому. Я не обращал много внимания на вывод матрицы. – akrun

ответ

2

Чтобы получить матрицу:

t(sapply(res_list, sapply, function(x) [email protected]$statistic)) 
# jarqueberaTest.X-squared shapiroTest.W lillieTest.D 
#a    0.9917054  0.9670860 0.08837058 
#b    0.1421776  0.9806379 0.12619274 

Или с rapply:

t(simplify2array(rapply(res_list, function(x) [email protected]$statistic, how = "list"))) 
# jarqueberaTest shapiroTest lillieTest 
#a 0.9917054  0.967086 0.08837058 
#b 0.1421776  0.9806379 0.1261927 
Смежные вопросы