考虑这个简单的例子
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
中有没有解决方案?
mydf%>%group_by(regular_col)%>%mutate(weird_col = invoke(paste,weird_col,collapse=","))%>%separate(weird_col,c("col1","col2"))
将数据框按照regular_col
字段进行分组,然后将weird_col
中的多个值拼接成一个字符串,并以逗号为分隔符。接着,将拼接后的字符串按照逗号分隔成两列,分别命名为col1
和col2
。 - Onyambudo.call
完全相同。 - Onyambuinvoke
is similar todo.call
(and it's a simple wrapper round it, if you look at the code), the main difference is that it has an additional...
argument, that @Onyambu uses here to specifycollapse=","
- moodymudskipper