如何用dplyr基于年份命名的列创建百分比变化新列?
解决方法
你的代码问题出在mutate步骤里:直接写year/(year-1)-1是在计算数值变量year的数学运算(也就是2022/2021-1),而不是引用数据框中名为2022和2021的列。需要用dplyr的非标准求值语法来动态引用列名,以下是两种可行的修正方案:
方案1:使用.data代词(推荐,更直观)
.data可以通过字符串形式的列名直接引用数据框中的列:
year = 2022 data1 %>% select(sprintf("%d", seq(from = year - 4, to = year, by = 1))) %>% mutate(percent = .data[[as.character(year)]] / .data[[as.character(year - 1)]] - 1)
方案2:使用sym()和!!操作符
先将年份转换为符号对象,再通过!!(bang-bang)操作符在mutate中求值:
year = 2022 # 将年份转为列名符号 current_year_col <- sym(as.character(year)) prev_year_col <- sym(as.character(year - 1)) data1 %>% select(sprintf("%d", seq(from = year - 4, to = year, by = 1))) %>% mutate(percent = !!current_year_col / !!prev_year_col - 1)
两种方案都能正确取到数据框中对应年份列的值,计算出2021到2022的百分比变化。
内容的提问来源于stack exchange,提问作者user11849
相关产品推荐
相关产品推荐

