在R语言中使用函数与lapply生成日期序列的问题
解决按天生成日期序列并合并数据的报错问题
错误原因
原代码的核心问题是列表y的结构与lapply的遍历逻辑不匹配:你定义的y是包含三个向量的列表(d1、d2、m各对应一组值),但lapply(y, fn)会逐个遍历y的三个向量元素,而非按“每组(d1,d2,m)”的逻辑处理。此时fn中的参数q是单个向量(比如y$d1),自然找不到"d1"下标,导致第一个报错;后续用get()尝试修复完全偏离逻辑,因为get()需要对象名称而非向量,所以出现第二个报错。
解决方法
方法1:调整列表结构为分组子列表
把y改成每个元素是包含d1、d2、m的子列表,让lapply按组遍历:
# 定义处理函数 fn <- function(q) { x <- data.frame( date = seq.Date(from = q[['d1']], to = q[['d2']], by = "days"), m = q[['m']], stringsAsFactors = FALSE ) return(x) } # 调整y的结构:每个子列表对应一组参数 y <- list( list(d1 = as.Date("2012/01/31"), d2 = as.Date("2012/01/31"), m = 100), list(d1 = as.Date("2012/01/14"), d2 = as.Date("2012/01/21"), m = 75) ) # 生成并合并数据 z <- do.call(rbind, lapply(y, fn))
方法2:用purrr::pmap处理平行向量(无需改原y结构)
如果你想保留原y的平行向量结构,可以用purrr包的pmap函数,它会按位置匹配各组参数:
# 安装并加载purrr包(首次使用需运行 install.packages("purrr")) library(purrr) # 定义接收单个参数的函数 fn <- function(d1, d2, m) { data.frame( date = seq.Date(from = d1, to = d2, by = "days"), m = m, stringsAsFactors = FALSE ) } # 原y结构保持不变 y <- list( d1 = as.Date(c("2012/01/31","2012/01/14")), d2 = as.Date(c("2012/01/31","2012/01/21")), m = c(100,75) ) # 生成并合并数据(pmap_dfr直接返回合并后的 data.frame) z <- pmap_dfr(y, fn)
内容的提问来源于stack exchange,提问作者A Mere Pigeon
相关产品推荐
相关产品推荐

