如何用tidyverse基于seqnbr列创建数值列表并执行unnest?
解决方案
可以用dplyr结合purrr的map()函数实现需求,具体步骤如下:
- 生成嵌套序列列
通过mutate()配合map(),针对每行seqnbr的值生成从该值到10的整数序列,并封装为列表:
library(tidyverse) x <- tibble(name = c('boo', 'bah', 'bee'), seqnbr = c(1,2,3)) # 添加嵌套列表列 x_with_list <- x %>% mutate(my_list = map(seqnbr, ~.x:10))
执行后得到的结果与预期一致:
# A tibble: 3 × 3 name seqnbr my_list <chr> <dbl> <list> 1 boo 1 <int [10]> 2 bah 2 <int [9]> 3 bee 3 <int [8]>
- 展开嵌套列表
使用unnest()(或unnest_longer())将嵌套的列表列展开:
x_unnested <- x_with_list %>% unnest(my_list)
展开后的最终结果:
# A tibble: 27 × 3 name seqnbr my_list <chr> <dbl> <int> 1 boo 1 1 2 boo 1 2 3 boo 1 3 4 boo 1 4 5 boo 1 5 6 boo 1 6 7 boo 1 7 8 boo 1 8 9 boo 1 9 10 boo 1 10 # ℹ 17 more rows
补充说明
map(seqnbr, ~.x:10)中,~代表匿名函数,.x指代seqnbr列的每个元素,自动生成对应起始值到10的序列,map()会将每个序列封装为列表元素对应到每行。- 也可以写成更直观的匿名函数形式:
map(seqnbr, function(n) n:10),效果完全相同。
内容的提问来源于stack exchange,提问作者Nettle
相关产品推荐
相关产品推荐

