R 转置嵌套列表

R 转置嵌套列表,r,list,nested,R,List,Nested,我想转置一个嵌套列表。假设给定了以下嵌套列表x: a <- list(c("a","b","c","d")) b <- list(c("d","c","b","a")) c <- list(c("4","3","2","1")) d <- list(c("1","2","3","4")) x <- list(a,b,c,d) a我们可以试试 m1 <- do.call(rbind, lapply(x, function(y) do.call(rbind,

我想转置一个嵌套列表。假设给定了以下嵌套列表x:

a <- list(c("a","b","c","d"))
b <- list(c("d","c","b","a"))
c <- list(c("4","3","2","1"))
d <- list(c("1","2","3","4"))

x <- list(a,b,c,d)
a我们可以试试

m1 <- do.call(rbind, lapply(x, function(y) do.call(rbind, y)))
relist(m1, skeleton = x)
m1我们可以试试

m1 <- do.call(rbind, lapply(x, function(y) do.call(rbind, y)))
relist(m1, skeleton = x)

m1我们也可以不使用
lappy
(使用矩阵):

基准测试

library(microbenchmark)
a <- list(c("a","b","c","d"))
b <- list(c("d","c","b","a"))
c <- list(c("4","3","2","1"))
d <- list(c("1","2","3","4"))
x <- list(a,b,c,d)

f_akrun <- function(x) {m1 <- do.call(rbind, lapply(x, function(y) do.call(rbind, y)));relist(m1, skeleton = x);}
f_m0h3n <- function(x) {relist(matrix(unlist(x), ncol = length(x[[1]][[1]]), byrow = T), skeleton = x)}

setequal(f_akrun(x), f_m0h3n(x))
# [1] TRUE
microbenchmark(f_akrun(x), f_m0h3n(x))

# Unit: microseconds
   # expr     min      lq     mean  median      uq     max neval
 # f_akrun(x) 135.591 137.301 144.3545 138.585 148.422 334.484   100
 # f_m0h3n(x) 110.782 111.638 116.5477 112.493 117.412 212.153   100
库(微基准)

a我们也可以不使用
lappy
(使用矩阵):

基准测试

library(microbenchmark)
a <- list(c("a","b","c","d"))
b <- list(c("d","c","b","a"))
c <- list(c("4","3","2","1"))
d <- list(c("1","2","3","4"))
x <- list(a,b,c,d)

f_akrun <- function(x) {m1 <- do.call(rbind, lapply(x, function(y) do.call(rbind, y)));relist(m1, skeleton = x);}
f_m0h3n <- function(x) {relist(matrix(unlist(x), ncol = length(x[[1]][[1]]), byrow = T), skeleton = x)}

setequal(f_akrun(x), f_m0h3n(x))
# [1] TRUE
microbenchmark(f_akrun(x), f_m0h3n(x))

# Unit: microseconds
   # expr     min      lq     mean  median      uq     max neval
 # f_akrun(x) 135.591 137.301 144.3545 138.585 148.422 334.484   100
 # f_m0h3n(x) 110.782 111.638 116.5477 112.493 117.412 212.153   100
库(微基准)

很好的thx。这对于大数据结构(如大型矩阵列表)也是可行的吗?我的MWE不是很好,我应该用矩阵来代替。@user3032689我还没有测试过大数据集。您也可以从
purrr
中检查
transpose
。请查看编辑的问题。purrr在这方面也帮不了我。@user3032689你能把它作为一个新问题发布吗?是的,发布在这里:尼斯thx。这对于大数据结构(如大型矩阵列表)也是可行的吗?我的MWE不是很好,我应该用矩阵来代替。@user3032689我还没有测试过大数据集。您也可以从
purrr
中检查
transpose
。请查看编辑的问题。purrr在这方面也帮不了我。@user3032689你能把它作为一个新问题发布吗?是的,发布在这里:
library(purrr);x%%>%simplify_all()%%>%transpose()%%>%simplify_all()%%>%map(列表)
如果您希望向量被转置,但结构相同,尽管它确实不必要嵌套。@alistaire谢谢,但是如果一个向量由整数组成,而不是由字符组成,这将不再有效。向量只能包含一种类型
purrr
不允许在不显式强制为一种类型的情况下简化字符和整数,例如
x%>%simplify\u all()%%>%map(as.character)%%>%transpose()%%>%simplify\u all()%%>%map(list)
。如果您愿意,
data.table::transpose
将自动强制。好的,我知道了,谢谢<代码>库(purrr);x%%>%simplify_all()%%>%transpose()%%>%simplify_all()%%>%map(列表)
如果您希望向量被转置,但结构相同,尽管它确实不必要嵌套。@alistaire谢谢,但是如果一个向量由整数组成,而不是由字符组成,这将不再有效。向量只能包含一种类型
purrr
不允许在不显式强制为一种类型的情况下简化字符和整数,例如
x%>%simplify\u all()%%>%map(as.character)%%>%transpose()%%>%simplify\u all()%%>%map(list)
。如果您愿意,
data.table::transpose
将自动强制。好的,我知道了,谢谢!