2016-07-09 3 views
1

ネストされたリストを転置したいと思います。次のネストされたリスト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) 

結果は、元のリストxの最初の列は、最初のネストされたリストの要素であり、それは、「A」、「D」であるネストされたリストであるべきで、」第2の列は第2のネストされたリスト要素、すなわち "b"、 "c"、 "3"、 "2"などである。結局、構造は元の構造の転置のようなものです。これはどのようにしてRで行うことができますか?

+0

'ライブラリ(purrr)。実際に不必要にネストされているにもかかわらず、ベクトルを転置したいが構造体を同じにしたい場合は、x%>%simplify_all()%>%transpose()%>%simplify_all()%>%map(list) – alistaire

+0

@alistaireありがとうございます。しかし、たとえば文字の場合は1つのベクトルが整数で構成されている場合、これはもう機能しません。 – user3032689

+1

ベクトルは1つのタイプしか保持できません。 'purrr'は、明示的に1つの型に強制することなく、文字と整数を単純化することはできません。 'x%>%simplify_all()%>%map(as.character)%>%転置()%>%simplify_all()%>%map(リスト)'あなたが望むならば、 'data.table :: transpose'は静かに強制します。 – alistaire

答えて

3

私たちは、我々はまた、(マトリックスを使用して)lapplyせずに行うことができます

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

良いthx。大規模な行列のリストのような大きなデータ構造に対しても可能ですか?私のMWEはそれほど良くはありませんでした。代わりに行列を使うべきでした。 – user3032689

+0

@ user3032689大きなデータセットをテストしていません。 'purrr'から' transpose'を確認することもできます – akrun

+0

編集した質問をご覧ください。それでも私は助けてくれません。 – user3032689

4

を試すことができます。

relist(matrix(unlist(x), ncol = 4, byrow = T), skeleton = x) 

ベンチマーク

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 
関連する問題