从列表的列表中提取某些元素

extract certain elements from lists of lists

我有一个包含多个相关测试输出的列表

dput(head(corr[1:2]))
list(structure(list(statistic = c(S = 1486), parameter = NULL, 
    p.value = 0.219369570345178, estimate = c(rho = 0.265810276679842), 
    null.value = c(rho = 0), alternative = "two.sided", method = "Spearman's rank correlation rho", 
    data.name = "x$theta.x and x$theta.y"), class = "htest"), 
    structure(list(statistic = c(S = 1852), parameter = NULL, 
        p.value = 0.699151237307271, estimate = c(rho = 0.0849802371541502), 
        null.value = c(rho = 0), alternative = "two.sided", method = "Spearman's rank correlation rho", 
        data.name = "x$theta.x and x$theta.y"), class = "htest"))

我想提取到一个单独的数据框中 p.value 并进行估算。对于每个元素,我可以这样做:

corr[[1]][3]
$p.value
[1] 0.2193696

> corr[[1]][4]
$estimate
rho 
0.2658103 

但是我没有成功地尝试一次从整个列表中提取这些值。

您可以使用 [ 来提取特定元素。

as.data.frame(t(sapply(corr, `[`, c(3, 4))))

#  p.value estimate
#1   0.219    0.266
#2   0.699    0.085

此外,使用 broom::tidy 可能更简单。

purrr::map_df(corr, broom::tidy)

#  estimate statistic p.value method                          alternative
#     <dbl>     <dbl>   <dbl> <chr>                           <chr>      
#1   0.266       1486   0.219 Spearman's rank correlation rho two.sided  
#2   0.0850      1852   0.699 Spearman's rank correlation rho two.sided  

为此,我们还可以使用 magrittr 包中的 extract 函数:

library(purrr)

df %>% map_dfr(magrittr::extract, c("estimate", "p.value"))

# A tibble: 2 x 2
  estimate p.value
     <dbl>   <dbl>
1   0.266    0.219
2   0.0850   0.699

我们可以做到

do.call(rbind, lapply(corr, \(x) data.frame(x[3:4])))
       p.value   estimate
rho  0.2193696 0.26581028
rho1 0.6991512 0.08498024