首页 > 解决方案 > 应用pivot_wider后如何将YAML标头中设置的字符值参数读取为列名?

问题描述

我正在尝试开发一个 R-markdown 报告,我可以在其中将参数设置为当前和上一个季度,如示例中所示。报告的一部分涉及将这些字符串转换为列名,然后计算百分比变化。但是, mutate() 调用将 params$ 评估为我设置给它们的字符串值,而不是它们已被旋转到的列名。是否有一种技巧可以使 mutate() 将参数值评估为列名,或者将参数设置为不同的值,以便代码按编写的方式工作?

---
title: "my_notebook"
output: html_notebook
params:
  this_qtr: "2020Q2"
  last_qtr: "2020Q1"
---

library(dplyr)
library(magrittr)
library(tidyr)

data <- tibble::tibble(quarter = c(rep(params$this_qtr, 4), rep(params$last_qtr, 4)),
                       amount = rnorm(8),
                       state = rep(c("pa", "nj", "md", "de"), 2))

data_wide <- data %>% pivot_wider(names_from = quarter, values_from = amount)

# throws an error because params$ are character strings rather than column names
data_pct_ch <- data_wide %>% mutate(pct_ch = params$this_qtr/params$last_qtr - 1)

标签: rdplyrr-markdowntidyr

解决方案


您需要将params值的字符串版本转换为符号。您可以使用 来执行此操作,rlang::sym然后将其注入到 mutate 中!!。尝试

data_pct_ch <- data_wide %>% 
  mutate(pct_ch = !!rlang::sym(params$this_qtr)/!!rlang::sym(params$last_qtr) - 1)

或者您可以将字符索引与.data代词一起使用

data_pct_ch <- data_wide %>% 
  mutate(pct_ch = .data[[params$this_qtr]]/.data[[params$last_qtr]] - 1)

推荐阅读