R语言列名为年份时如何正确计算两列数值的差值
R 透视表数字列名计算问题解决方法
问题原因
纯数字开头的列名在dplyr的mutate()非标准求值逻辑中,会被优先识别为数值常量而非数据框的列,直接写2012 - 2015就是两个数字相减得到固定值-3;加单/双引号后列名会被识别为字符串,字符串无法做减法运算,因此报错。
解决方案
方案1:用反引号包裹数字列名(最简单直接)
在数字列名前后加反引号`,显式告诉dplyr这是数据框的列变量即可:
df %>% pivot_wider(names_from = year, values_from = value) %>% mutate(diff = `2012` - `2015`)
方案2:用.data代词引用列(更规范,适合动态传参场景)
如果需要计算的年份是动态生成的变量,推荐用.data代词显式引用数据环境中的列,适配性更强:
# 固定列名写法 df %>% pivot_wider(names_from = year, values_from = value) %>% mutate(diff = .data[["2012"]] - .data[["2015"]]) # 动态传参写法示例(要计算的年份存储在变量中时可用) start_year <- "2012" end_year <- "2015" df %>% pivot_wider(names_from = year, values_from = value) %>% mutate(diff = .data[[start_year]] - .data[[end_year]])
运行以上任意一种代码都能得到你预期的diff列计算结果。
内容的提问来源于stack exchange,提问作者Jimmy Cloutier
相关产品推荐
相关产品推荐

