考虑这个简单的例子
mydf <- data_frame(regular_col = c(1,2),
normal_col = c('a','b'),
weird_col = list(list('hakuna', 'matata'),
list('squash', 'banana')))
> mydf
# A tibble: 2 x 3
regular_col normal_col weird_col
<dbl> <chr> <list>
1 1 a <list [2]>
2 2 b <list [2]>
字符串
我想提取weird_col
的元素(以编程方式,元素的数量可能会改变),以便将每个元素放置在不同的列中。
> data_frame(regular_col = c(1,2),
+ normal_col = c('a','b'),
+ weirdo_one = c('hakuna', 'squash'),
+ weirdo_two = c('matata', 'banana'))
# A tibble: 2 x 4
regular_col normal_col weirdo_one weirdo_two
<dbl> <chr> <chr> <chr>
1 1 a hakuna matata
2 2 b squash banana
型
然而,我无法用简单的术语来做到这一点。例如,使用经典的unnest
在这里就失败了,因为它扩展了嵌套框架,而不是将列表中的每个元素放在不同的列中。
> mydf %>% unnest(weird_col)
# A tibble: 4 x 3
regular_col normal_col weird_col
<dbl> <chr> <list>
1 1 a <chr [1]>
2 1 a <chr [1]>
3 2 b <chr [1]>
4 2 b <chr [1]>
型
在tidyverse
中是否有解决方案?
3条答案
按热度按时间ztigrdn81#
您可以从
unnest
的输出中提取值,稍微处理一下以生成列名,然后返回spread
。请注意,我使用flatten_chr
是因为您的深度为1的列表列,但如果它是嵌套的,您可以使用flatten
,而spread
也可以在列表列上工作。字符串
由reprex package(v0.2.0)于2018-08-12创建。
rqdpfwrv2#
unnest
垂直开发列表和向量,水平开发一行数据框。所以我们可以做的是将您的列表更改为数据框(具有足够的列名),然后再使用unnest
。字符串
h7appiyu3#
tidyr
1.0引入unnest_wider()
正是为了这个目的。字符串
创建于2023-12-15使用reprex v2.0.2