如何取消引用 fable::aggregate_key 的字符列名称?

How do i unquote a character column name for fable::aggregate_key?

我正在尝试使用 fable 包中的 aggregate_key 函数在闪亮的 flexdashboard 中创建分层时间序列。只要我可以在列名称 'value'.

中进行硬编码,下面的代码就可以正常工作
library(tidyverse)
library(tsibble)
library(fable)
library(fpp2)

agg_key <- cbind.data.frame(visnights, year=1900:1975) %>% 
  pivot_longer(NSWMetro:OTHNoMet, names_to=c("State", "Region"), names_sep=c(3)) %>%
  as_tsibble(index=year, key=c(State, Region)) %>%
  aggregate_key(State / Region, value=sum(value))

出现问题是因为我使用 flexdashboard 输入来获取列名,因此它以字符串“值”的形式出现。我试过跟帖没用。

#only repeating the last line in the pipe for brevity
aggregate_key(State / Region, value=sum(!!"value"))
aggregate_key(State / Region, value=sum(!!!"value"))
aggregate_key(State / Region, value=sum(as.name("value")))
aggregate_key(State / Region, value=sum(as_label("value")))

请帮我弄清楚如何将字符串传递给此函数。

aggregate_key() 函数具有 summarise() 语义,因此任何适用于 non-standard 评估 (NSE) 和 summarise() 的功能也应该在这里工作。

要将字符串转换为符号(列的名称),您可以使用 as.name("value")as.symbol("value")rlang::sym("value")。 您上面的尝试非常接近,并且您拥有使其成功所需的所有要素。

一个可行的解决方案是使用 value = sum(!!as.name("value")):

library(tidyverse)
library(tsibble)
library(fable)
library(fpp2)

cbind.data.frame(visnights, year=1900:1975) %>% 
  pivot_longer(NSWMetro:OTHNoMet, names_to=c("State", "Region"), names_sep=c(3)) %>%
  as_tsibble(index=year, key=c(State, Region)) %>%
  aggregate_key(State / Region, value=sum(!!as.name("value")))
#> # A tsibble: 2,052 x 4 [1Y]
#> # Key:       State, Region [27]
#>     year State        Region       value
#>    <int> <chr>        <chr>        <dbl>
#>  1  1900 <aggregated> <aggregated>  83.4
#>  2  1901 <aggregated> <aggregated>  64.6
#>  3  1902 <aggregated> <aggregated>  71.3
#>  4  1903 <aggregated> <aggregated>  70.0
#>  5  1904 <aggregated> <aggregated>  86.4
#>  6  1905 <aggregated> <aggregated>  66.4
#>  7  1906 <aggregated> <aggregated>  71.4
#>  8  1907 <aggregated> <aggregated>  67.4
#>  9  1908 <aggregated> <aggregated>  84.6
#> 10  1909 <aggregated> <aggregated>  64.0
#> # … with 2,042 more rows

reprex package (v0.3.0)

于 2020-09-23 创建

正如您上面提到的,以交互方式编写此代码您将使用 value = sum(value)。要以编程方式使用字符串执行此操作,您需要使用 rlang::sym("value")(或以上替代方法)将 "value" 转换为 value,然后使用 !! 告诉 aggregate_key() 使用数据列 value 而不是文字符号 value.

可以在此处找到有关使用 dplyr(以及因此 aggregate_key())进行编程的更多提示:https://dplyr.tidyverse.org/articles/programming.html