【问题标题】:Converting Uneven List to Dataframe将不均匀列表转换为数据框
【发布时间】:2020-05-09 18:34:38
【问题描述】:

我想知道在下面的示例中是否有一种优雅且可通用的方式将 mylist 转换为 mydf。我查看了rectangling vignette,但 unnest/hoist 的示例似乎在具有常规但不整洁结构的列表中。

mylist <- list(name = "example",
               idnum = 123,
               cases = list(
                 case1 = list(
                   type = 1,
                   genre = "A"),
                 case2 = list(
                   type = 1,
                   genre = "B"),
                 case3 = list(
                   type = 2,
                   genre = "A"
                 )))

mydf <- data.frame(name = rep("example", 3),
                   idnum = rep(123, 3),
                   cases = c("case1", "case2", "case3"),
                   type = c(1, 1, 2),
                   genre = c("A", "B", "A"))

编辑:这接近我想要的,但我丢失了案例名称

mylist %>%
  as_tibble %>%
  unnest_wider(cases)

# A tibble: 3 x 4
  name    idnum  type genre
  <chr>   <dbl> <dbl> <chr>
1 example   123     1 A    
2 example   123     1 B    
3 example   123     2 A 

【问题讨论】:

  • 使用purrr,您可以尝试mylist %&gt;% map_at("cases", ~ map_dfr(., data.frame, .id = "cases")) %&gt;% as_tibble()
  • 我认为这是正确的轨道,使用 map_if(is_list, ....) 我们也许能够获得不需要指定我正在寻找的“案例”的通用解决方案

标签: r list dataframe tidyr


【解决方案1】:

一个选项是bind_rowsunnest_wider

library(dplyr)
library(tidyr)
bind_rows(mylist) %>% 
   mutate(case = names(cases)) %>%
   unnest_wider(c(cases))
# A tibble: 3 x 5
# name    idnum  type genre case 
#  <chr>   <dbl> <dbl> <chr> <chr>
#1 example   123     1 A     case1
#2 example   123     1 B     case2
#3 example   123     2 A     case3

或者正如 @Ben 在 cmets 中建议的那样

mylist %>% 
     as_tibble %>% 
     mutate(case = names(cases)) %>% 
     unnest_wider(c(cases))
# A tibble: 3 x 5
#  name    idnum  type genre case 
#  <chr>   <dbl> <dbl> <chr> <chr>
#1 example   123     1 A     case1
#2 example   123     1 B     case2
#3 example   123     2 A     case3

【讨论】:

  • 我在运行此代码时收到错误“参数 3 必须是长度 1,而不是 3”,但我认为 mutate 行很有帮助,所以现在我可以这样做:mylist %&gt;% as_tibble() %&gt;% mutate(case = names(cases)) %&gt;% unnest_wider(c(cases))
  • @Ben 可能与包的版本有关
猜你喜欢
  • 2020-01-04
  • 2011-03-25
  • 2011-04-04
  • 1970-01-01
  • 2010-09-20
  • 2017-01-07
  • 2020-09-07
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多