转置R中列表的元素

  • 本文关键字:元素 列表 转置 r
  • 更新时间 :
  • 英文 :


我有这个列表:

list1 <- list(A = c("A1", "B1", "C1"), B = c("A2", "B2", "C2"), D = c("A3", "B3", "C3"))
list2 <- list(A = c("D1", "E1", "F1"), B = c("D2", "E2", "F2"), D = c("D3", "E3", "F3"))
list3 <- list(A = c("G1", "H1", "I1"), B = c("G2", "H2", "I2"), D = c("G3", "H3", "I3"))
my_list <- list(list1, list2, list3)

我想把它变成这个列表:

list1a <- list(A = c("A1", "B1", "C1"), B = c("D1", "E1", "F1"), D = c("G1", "H1", "I1"))
list2a <- list(A = c("A2", "B2", "C2"), B = c("D2", "E2", "F2"), D = c("G2", "H2", "I2"))
list3a <- list(A = c("A3", "B3", "C3"), B = c("D3", "E3", "F3"), D = c("G3", "H3", "I3"))
my_new_list <- list(list1a, list2a, list3a)

使用baseR函数最有效的解决方案是什么?

一个选项

sapply(1:length(my_list),function(x){lapply(my_list,"[[",x)},simplify=F)
[[1]]
[[1]][[1]]
[1] "A1" "B1" "C1"
[[1]][[2]]
[1] "D1" "E1" "F1"
[[1]][[3]]
[1] "G1" "H1" "I1"
...

purrr具有以下转换函数:

library(purrr)
my_list_t <- transpose(my_list)
str(my_list_t)

给予:

List of 3
$ A:List of 3
..$ : chr [1:3] "A1" "B1" "C1"
..$ : chr [1:3] "D1" "E1" "F1"
..$ : chr [1:3] "G1" "H1" "I1"
$ B:List of 3
..$ : chr [1:3] "A2" "B2" "C2"
..$ : chr [1:3] "D2" "E2" "F2"
..$ : chr [1:3] "G2" "H2" "I2"
$ D:List of 3
..$ : chr [1:3] "A3" "B3" "C3"
..$ : chr [1:3] "D3" "E3" "F3"
..$ : chr [1:3] "G3" "H3" "I3"

请注意,由于平衡,这可以用一个数组来表示,在这种情况下可以使用aperm。

a <- array(unlist(my_list), c(3, 3, 3))
ap <- aperm(a, c(1, 3, 2))
all(a == unlist(my_list))
## [1] TRUE
all(ap == unlist(my_list_t))
## [1] TRUE

最新更新