首页 > 解决方案 > 在由嵌套列表组成的 tibble 中取消嵌套变量

问题描述

使用一些 JSON 数据,我有一个结构奇怪的小标题:

suppressMessages(library(tidyverse))
df <- data_frame(y = c("D", "E"), z = list(list(a = 1, b = 2, c = 3), list(a = 4, c = 5)))

我想取消z。这几乎有效:

> unnest(df, z, .id = "name")
# A tibble: 5 x 3
  y     z          name
  <chr> <list>    <int>
1 D     <dbl [1]>     1
2 D     <dbl [1]>     1
3 D     <dbl [1]>     1
4 E     <dbl [1]>     2
5 E     <dbl [1]>     2

但我想要的是这样的:

# A tibble: 5 x 3
  y         z name 
  <chr> <dbl> <chr>
1 D         1 a    
2 D         2 b    
3 D         3 c    
4 E         4 a    
5 E         5 c    

如何避免丢失名称信息并弹出 z 的值?

感谢@AntoniosK 解决了我的问题。这是他的(稍微编辑过的)解决方案:

df %>%
  mutate(d = map(z, ~data.frame(.x) %>% gather(name, z))) %>%
  unnest(d)

# # A tibble: 5 x 3
#   y     name      z
#   <chr> <chr> <dbl>
# 1 D     a         1
# 2 D     b         2
# 3 D     c         3
# 4 E     a         4
# 5 E     c         5

标签: rdplyr

解决方案


suppressMessages(library(tidyverse))

df <- data_frame(y = c("D", "E"), x = list(list(a = 1, b = 2, c = 3), list(a = 4, c = 5)))

df %>%
  mutate(d = map(x, ~data.frame(.x) %>% gather(name, x))) %>%
  unnest(d)

# # A tibble: 5 x 3
#   y     name      x
#   <chr> <chr> <dbl>
# 1 D     a         1
# 2 D     b         2
# 3 D     c         3
# 4 E     a         4
# 5 E     c         5

推荐阅读