使用列表名称作为一列中的值列入tibble

时间:2017-09-20 12:26:46

标签: r list tidyverse purrr tibble

我想转换一个这样的列表:

l <- list(x = c(1, 2), y = c(3, 4, 5))

像这样的一个小组:

 Name  Value 
 x      1
 x      2
 y      3
 y      4
 y      5

3 个答案:

答案 0 :(得分:7)

我认为没有什么比使用基础R的ReadAsync2 - 函数更容易了:

stack

给你一个数据帧:

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

另一种纯碱基R方法:

df <- as.tibble(stack(l))

给出了类似的结果:

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 不是必需的,但会将rownumbers作为rownames。

答案 1 :(得分:1)

我们可以使用melt

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

答案 2 :(得分:0)

更新

我找到了更好的解决方案。

这适用于简单和复杂的列表,例如我之前发布的列表(下面)

l %>% map_dfr(~ .x %>% as_tibble(), .id = "name")

给我们

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

============================================== < / H1>

原始答案

来自 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

基础R的堆栈函数非常适合简单列表,如Jaap所示。

然而,更复杂的列表如:

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