R语言 如何将一组列表的一部分汇总到表中

k4ymrczo  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(147)

我正尝试将多个查询的结果拉到一个表中。所有结果都在一个列表列表中,通常作为统计评估中的单个数字。我还需要能够指定要将哪个列表结果制成表格。例如,列表集:

list1 <- list(1, 2, 3, 4)
  names(list1) <- c("first", "second", "third", "fourth")
list2 <- list(10, 11, 12, 13)
  names(list2) <- c("first", "second", "third", "fourth")
list3 <- list(100, 101, 102, 103)
  names(list3) <- c("first", "second", "third", "fourth")

我可以从每个列表中单独获取结果:

library(magrittr)

row1 <- list1[c("second", "third")] %>%
  rbind() %>%
  unlist()

row2 <- list2[c("second", "third")] %>%
  rbind() %>%
  unlist()

row3 <- list3[c("second", "third")] %>%
  rbind() %>%
  unlist()

然后将它们添加到数据框中,然后命名每列,最后打印结果

library(kableExtra)
desired_table <- rbind(row1, row2, row3)
colnames(desired_table) <- c("second", "third")

kbl(desired_table)

在我看来,应该有一个更容易的方法,我希望有。
我怎样才能对一个包结果列表做到这一点呢?要么是对另一个包,要么是用一种我没有想到的方法?

m1m5dgzv

m1m5dgzv1#

和"$"一样,方括号是一个中缀运算符,它是一个伪装的函数调用。你甚至可以写"["(list(0,1,2,3), 1),并期望得到0。
sapply函数创建连续调用,第一个调用是list(list1,list2,list3)[[1]][ c("second", "third") ],第二个调用是list(list1,list2,list3)[[2]][ c("second", "third") ],以此类推。在其背后,sapplylappy只是使用隐式顺序整数迭代器伪装的for循环。
下面是一个由两个标准R函数("["sapply)组成的基本应用程序,它作为一个行程序来执行此操作:

t( sapply( list(list1,list2,list3), "[", c("second", "third") ) )
     second third
[1,] 2      3    
[2,] 11     12   
[3,] 101    102
library(kableExtra)
desired_table <- t( sapply(list(list1,list2,list3), "[", c("second", "third") ) )
png()
kbl(desired_table); dev.off()

可能需要在这两列之间添加一点空格:

qhhrdooz

qhhrdooz2#

我们可以使用purrr包中的modify_depth

library(purrr)

my_nested_list <- list(list1, list2, list3)

second <- modify_depth(my_nested_list, 1, "second") %>% 
  unlist()
third <- modify_depth(my_nested_list, 1, "third") %>% 
  unlist()

desired_table <- cbind(second, third)
colnames(desired_table) <- c("second", "third")

desired_table
second third
[1,]      2     3
[2,]     11    12
[3,]    101   102

相关问题