【发布时间】:2019-10-24 10:50:10
【问题描述】:
下面的小标题有一个列表列property,其中包含一些缺失值:
library(tidyverse)
tbl = tibble(type = c('scale', 'range', 'min', 'max'),
property = list(list(lttr = letters, mth = month.name), NA) %>%
rep(., 2))
# A tibble: 4 x 2
type property
<chr> <list>
1 scale <list [2]>
2 range <lgl [1]>
3 min <list [2]>
4 max <lgl [1]>
我想取消嵌套此列,然后将结果扩展为包含三列的宽格式 - type、lttr 和 mth:
tbl = tibble(type = c('scale', 'range', 'min', 'max'),
property = list(list(lttr = letters, mth = month.name), NA) %>%
rep(., 2)) %>%
mutate(property = map_if(property, is_list, enframe)) %>%
unnest(property) %>%
spread(name, value)
但是,unnest 调用会引发以下错误:
Error: Each column must either be a list of vectors or a list of data frames [property]
我在Git 上遇到了类似的问题,要求unnest 支持NULL 值,但没有提及NAs。函数文档中似乎也没有任何与缺失有关的参数,但我可能是错的。
如果NAs 被过滤掉,管道将按预期工作:
tbl = tibble(type = c('scale', 'range', 'min', 'max'),
property = list(list(lttr = letters, mth = month.name), NA) %>%
rep(., 2)) %>%
mutate(property = map_if(property, is_list, enframe)) %>%
filter(!is.na(property)) %>% # drop_na() and na_omit not working not sure why
unnest(property) %>%
spread(name, value)
tbl
# A tibble: 2 x 3
type lttr mth
<chr> <list> <list>
1 min <chr [26]> <chr [12]>
2 scale <chr [26]> <chr [12]>
【问题讨论】:
-
您的预期输出包含 3 个新列,其中包含
max和range值以及所有NAs ? -
是的,这可能吗?
标签: r dplyr tidyr data-manipulation unnest