如何取消引用 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
我正在尝试使用 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