purrr::pmap参数未按元素传递致报错,求向量化解决方案
解决pmap调用报错并生成嵌套数据框列的方案
看起来你卡在了用purrr::pmap生成嵌套数据框列的步骤上,问题主要出在两个地方:一是参数传递的方式不对(函数拿到的是整个列而非单行元素),二是用错了pmap_dfr——它是用来合并结果的,而你需要把每个行的结果单独存在列里。
问题根源拆解
- 参数传递错误:直接把
testdf传给pmap_dfr时,函数会把整个列作为参数输入,而不是每行的单个值,这就导致你的CallScheduleGen函数无法正确生成对应行数的小数据框。 - 函数选择错误:
pmap_dfr的作用是将所有返回的小数据框按行绑定成一个大数据框,但你的需求是给每行生成一个独立的数据框并存入CallSch列,所以应该用基础的pmap返回列表,再赋值为列表列。
修正后的完整代码
library(tidyverse) # 构建原始数据(用dplyr的管道更简洁) testdf <- tibble( redemption = rep(100, 3), periods = c(10, 11, 12), firstcallDate = as.Date(c("2014-01-01", "2015-01-01", "2016-01-01")) ) # 定义生成赎回计划的函数 CallScheduleGen <- function(redemption, periods, firstcallDate) { Price <- rep(as.double(redemption), periods) Date <- seq(firstcallDate, by = "1 month", length.out = periods) data.frame(Price, Date) } # 生成嵌套的列表列:每行对应一个小数据框 testdf <- testdf %>% mutate(CallSch = pmap(list(redemption, periods, firstcallDate), CallScheduleGen))
代码说明
- 列表列的使用:在tidyverse中,要在单元格里存储数据框这类复杂对象,必须用列表列(list column),
pmap返回的列表正好可以直接赋值给列。 - 参数匹配:
pmap(list(redemption, periods, firstcallDate), ...)会把每行的三个参数值单独传给CallScheduleGen,确保函数每次处理的是单行的数值,而非整个列。 - 简化写法:如果你的函数参数名和数据框列名完全一致,还可以更简洁地写:
这里的testdf <- testdf %>% mutate(CallSch = pmap(., CallScheduleGen)).代表当前数据框,pmap会自动按列名匹配函数参数。
验证结果
你可以查看第一行生成的赎回计划:
testdf$CallSch[[1]]
会输出10行的小数据框,包含Price(全为100)和从2014-01-01开始的10个月份日期。
这样就实现了用向量化方案(无显式循环)给每行生成独立数据框的需求。
内容的提问来源于stack exchange,提问作者ruserb2122
相关产品推荐
相关产品推荐

