purrr管道匿名函数中如何遍历列表数据框生成年份列
错误根源
- 早期非管道代码的固定值问题:硬编码引用列表第一个元素
test[[1]]的列名,未在每次迭代时匹配当前处理的数据框,导致所有数据框生成的year值都固定为1970。 - 管道写法的报错原因:索引逻辑偏差。当
map迭代到单个tibble时,.x[[1]]已经取出第一列的全部观测值组成的向量,追加[1]只会读取到列内的第一个数值,names()作用于一个数值向量得到空值,完全没有获取到列名信息,最终提取的年份值长度为0,触发mutate()的长度匹配报错。
正确实现
在每次迭代时直接读取当前tibble的列名,无需嵌套取列值操作:
data <- test %>% map(~ .x %>% mutate( year = as.integer(str_sub(names(.x)[1], -4)) ))
适配说明
- 示例中每张表的所有列名末尾都对应当前数据的采集年份,取第一列列名截取后4位的逻辑完全适配场景需求
- 生成的year值是和单张表行数一致的整数向量,会自动循环匹配数据长度,不会触发长度不匹配的报错
- 运行后两个列表元素的year值分别为1970、1980,完全符合预期
内容的提问来源于stack exchange,提问作者nicholas
相关产品推荐
相关产品推荐

