2017-09-20 136 views

回答

6

我覺得沒有什麼會更容易比使用stack -function從基礎R:

df <- stack(l) 

給你一個數據幀回:

> df 
    values ind 
1  1 x 
2  2 x 
3  3 y 
4  4 y 
5  5 y 

因爲你問tibble作爲輸出,你可以做as_tibble(df)(從tibble -package)來獲取。

或者更直接地:df <- as.tibble(stack(l))


另一個純基R法:

df <- data.frame(ind = rep(names(l), lengths(l)), value = unlist(l), row.names = NULL) 

其給出類似的結果:

> df 
    ind value 
1 x  1 
2 x  2 
3 y  3 
4 y  4 
5 y  5 

不一定需要的row.names = NULL但給人rownumbers作爲rownames。

1

我們可以使用meltreshape2

library(reshape2) 
melt(l) 
# value L1 
#1  1 x 
#2  2 x 
#3  3 y 
#4  4 y 
#5  5 y 
0

tidyverse

l %>% 
    map(~ as_tibble(.x)) %>% 
    map2(names(.), ~ add_column(.x, Name = rep(.y, nrow(.x)))) %>% 
    bind_rows() 

給我們

# A tibble: 5 × 2 
    value Name 
    <dbl> <chr> 
1  1  x 
2  2  x 
3  3  y 
4  4  y 
5  5  y 

Jaap展示的基本R的堆棧函數對於簡單列表非常有用。

然而,與像更復雜的列表:

l <- list(
    a = list(num = 1:3, let_a = letters[1:3]), 
    b = list(num = 101:103, let_b = letters[4:6]), 
    c = list() 
) 

我們得到

stack(l) 

values ind 
1  1 a 
2  2 a 
3  3 b 
4  a b 
5  b a 
6  c a 
7  101 b 
8  102 b 
9  103 a 
10  d a 
11  e b 
12  f b 

這是不對的。

上面所示的tidyverse溶液工作正常,從嵌套列表的不同元件保持數據分離:

# A tibble: 6 × 4 
    num let Name lett 
    <int> <chr> <chr> <chr> 
1  1  a  a <NA> 
2  2  b  a <NA> 
3  3  c  a <NA> 
4 101 <NA>  b  d 
5 102 <NA>  b  e 
6 103 <NA>  b  f