如何在tidyverse中使用purrr::map生成由数据框组成的列表列
正确实现方案
1. 单参数场景
你写的wrong4是正确写法,错误的是wrong5多套了一层list()导致整个列只存了一个总列表。正确代码如下:
result_single <- df %>% mutate(list1 = map(a, fun_one_arg))
这时候result_single$list1就是长度为3的列表,每个元素对应一行a值生成的4×2数据框,和你之前rowwise得到的结构完全一致。运行后可通过result_single$list1[[行号]]查看对应行生成的数据框,验证结构是否符合预期。
2. 双参数场景
你之前报错是因为普通map只支持传入单组迭代参数,多参数并行迭代需要用purrr提供的map2(双参数)或pmap(三个及以上参数),代码如下:
result_multi <- df %>% mutate(list1 = map2(a, b, fun))
这里map2会按行取a和b的值,依次传入fun的q和y参数,返回的结果和你原rowwise方案完全一致。
如果后续参数更多,比如要把c也传入fun修改为三个参数的版本,就用pmap,把要传入的列放到list()里即可:
# 假设fun修改为三个参数q,y,z的版本 result_pmap <- df %>% mutate(list1 = pmap(list(a, b, c), fun))
并行替换说明
不管是map、map2还是pmap,都可以直接替换成furrr包对应的future_map、future_map2、future_pmap,不需要修改其他逻辑即可实现并行计算,完全符合你的需求。
之前错误尝试的原因
- 错误1/2/3:
map只接收单组迭代参数,你传入了a和b两个列,map会把两个列的所有元素拼接成一个总列表/向量迭代,调用fun的时候只传了第一个参数,自然报y缺失的错误 - 错误5:多套了一层
list(),把本来长度和行数匹配的map返回列表,又包成了长度为1的列表,导致整个列所有行都共享同一个总列表,不符合列表列每一行对应一个元素的要求
内容的提问来源于stack exchange,提问作者bill999
相关产品推荐
相关产品推荐

