【问题标题】:Preserve names when unnest a named list column取消嵌套命名列表列时保留名称
【发布时间】:2019-06-20 22:09:47
【问题描述】:

这是我的代表:

make_named_list <- function(x) {
  list(apple = 1, banana = 2, carrot = 3)
}

tibble(x = 1:3, y = 2:4) %>% 
  mutate(z = map(x, make_named_list)) %>% 
  unnest() %>% 
  pull(z)

输出是一个没有任何名称的列表,但我想输出一个命名列表。我查看了一个相关问题here,但我不确定该解决方案是否适用于我的(更简单的?)场景。

要清楚,所需的输出是:

list(apple = 1, banana = 2, carrot = 3, 
     apple = 1, carrot = 2, banana = 3, 
     apple = 1, banana = 2, carrot = 3)

【问题讨论】:

  • 嗨@rcorty,您能告知所需的输出吗?我无法确定您是否希望列表中的每个位置都有一个名称(苹果、香蕉、胡萝卜)或其他名称。
  • 仅供参考,unnest() 函数在 tidyr 的开发版本中进行了一些更新,使保持列表名称更容易。在NEWS 中查看一些信息。
  • 哇,有很多变化即将到来(哈哈)...感谢您指出这一点
  • 我用 tidyr 的开发版试了一下,输出中仍然没有名字

标签: r dplyr tidyverse purrr


【解决方案1】:

根据您的输出要求,您可以尝试以下方法之一

library(tidyverse)

tibble(x = 1:3, y = 2:4) %>% 
  mutate(z = map(x, make_named_list)) %>%
  pull(z) 

#[[1]]
#[[1]]$apple
#[1] 1

#[[1]]$banana
#[1] 2

#[[1]]$carrot
#[1] 3


#[[2]]
#[[2]]$apple
#[1] 1
#.....

或者

tibble(x = 1:3, y = 2:4) %>% 
   mutate(z = map(x, make_named_list)) %>%
   pull(z) %>% unlist() 

# apple banana carrot  apple banana carrot  apple banana carrot 
#     1      2      3      1      2      3      1      2      3 

或者

tibble(x = 1:3, y = 2:4) %>% 
   mutate(z = map(x, make_named_list)) %>%
   pull(z) %>% unlist() %>% as.list()

#$apple
#[1] 1

#$banana
#[1] 2

#$carrot
#[1] 3

#$apple
#[1] 1
#... 

【讨论】:

    【解决方案2】:

    看起来我们只需要rep

    rep(make_named_list(3), 3)
    #$apple
    #[1] 1
    
    #$banana
    #[1] 2
    
    #$carrot
    #[1] 3
    
    #$apple
    #[1] 1
    
    #$banana
    #[1] 2
    
    #$carrot
    #[1] 3
    
    #$apple
    #[1] 1
    
    #$banana
    #[1] 2
    
    #$carrot
    #[1] 3
    

    或者如果我们使用tidyverse,那么使用flatten

    tibble(x = 1:3, y = 2:4) %>% 
        transmute(z = map(x, make_named_list)) %>% 
        pull(z) %>% 
        flatten
    #$apple
    #[1] 1
    
    #$banana
    #[1] 2
    
    #$carrot
    #[1] 3
    
    #$apple
    #[1] 1
    
    #$banana
    #[1] 2
    
    #$carrot
    #[1] 3
    
    #$apple
    #[1] 1
    
    #$banana
    #[1] 2
    
    #$carrot
    #[1] 3
    

    【讨论】:

      【解决方案3】:

      在unnest() 中设置names_repair = tidyr_legacy。

      library(tidyverse)
      make_named_list <- function(x) {
        list(apple = 1, banana = 2, carrot = 3)
      }
      
      tibble(x = 1:3, y = 2:4) %>% 
        mutate(z = map(x, make_named_list)) %>% 
        unnest(cols = c(z), names_repair = tidyr_legacy) %>% 
        pull(z)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 2016-06-04
        • 2018-08-21
        相关资源
        最近更新 更多