如何用purrr::map遍历列名列表在R中生成新列并解决报错
问题分析与解决方案
你的代码报错核心原因是:map遍历的vec是字符串列名,直接在transmute中写d - .x相当于让日期列和字符串做减法,R无法处理不同类型的运算,导致报错。
修正后的基础用法
用.data代词通过字符串引用列,就能正确执行日期减法:
library(tidyverse) df <- tibble(a=seq.Date(from=ymd("2021-01-01"),to =ymd("2021-12-31"),by = "day"), b=seq.Date(from=ymd("2020-01-01"),to =ymd("2020-12-31"),by = "day"), c=seq.Date(from=ymd("2019-01-01"),to =ymd("2019-12-31"),by = "day"), d=seq.Date(from=ymd("2018-01-01"),to =ymd("2018-12-31"),by = "day") ) vec <- c("a","b","c") # 遍历列名并计算差值,返回列表形式的结果 map(vec, ~ transmute(df, diff = d - .data[[.x]]))
合并结果为单个数据框
如果希望把所有计算结果合并成一个数据框,用map_dfc配合动态列名:
# 生成带命名的差值列,合并为单个数据框 map_dfc(vec, ~ transmute(df, !!paste0("diff_", .x) := d - .data[[.x]]))
这里!!paste0("diff_", .x)是动态生成列名,确保每个差值列对应原始列的名称(比如diff_a对应列a与d的差值)。
内容的提问来源于stack exchange,提问作者alejandro_hagan
相关产品推荐
相关产品推荐

