取消嵌套命名列表列时保留名称
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 中的数据框(将名称信息保留为列名)的快速方法