取消嵌套命名列表列时保留名称

Posted

技术标签:

【中文标题】取消嵌套命名列表列时保留名称【英文标题】: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 的开发版试了一下,输出中仍然没有名字 看看这是否有帮助***.com/questions/50187445/… 【参考方案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)

【讨论】:

以上是关于取消嵌套命名列表列时保留名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 数据框中取消嵌套列表,同时保留键和值?

一种将不同长度的命名向量合并到 R 中的数据框(将名称信息保留为列名)的快速方法

jq streaming - 过滤嵌套列表并保留全局结构

隐藏列时如何保留表格列的宽度?

如何在确认框的取消事件后强制 asp.net 列表框保留选定的值?

隐藏前一列时如何保留列的位置?