У меня есть набор данных, в котором мне нужно настроить несколько переменных для инфляции. Это выглядит примерно так.
год | цена1 | цена2 | цена3 | цена4 |
---|---|---|---|---|
2003 г. | 1,149 | 1,149 | 1,163 | 1,172 |
2004 г. | 1,169 | 1,164 | 1,184 | 1,18 |
2005 г. | 1,167 | 1,166 | 1,183 | 1,178 |
Мне нужно поместить все это в постоянный формат (например, доллары 2020 года). Я могу сделать это довольно легко с помощью функции adjust_for_inflation
из пакета priceR
. Однако существует много ценовых переменных, поэтому я хотел бы создать их все автоматически. Я пытался сделать с across
, но это не работает. Вот что я пытался.
library(tidyverse)
library(priceR)
#this is it done manually, which would take hours
df %>% mutate(adjusted_price1=adjust_for_inflation(price1,year,"US",to_date = 2020))
#here's my attempt to do it all at once
price.vars <- df %>% select(-year) %>% names()
dollars2020 <- function(x){
y <- adjust_for_inflation(x,year,"US",to_date = 2020)
}
df <- df %>%
mutate(across(price.vars, dollars2020,.names ="adjusted_{col}"))
Насколько я могу судить, это должен быть список новых переменных с именами вроде adjusted_price1
и так далее. Но это не работает. Я был бы очень признателен за любую помощь, которую кто-либо мог бы дать.
Проблема не в том, что вы используете across
, а в вашей функции. Во-первых, вы передаете несуществующую переменную с именем year
в adjust_for_inflation
. Во-вторых, ваша функция ничего не возвращает. Если вы измените его на:
dollars2020 <- function(x){
adjust_for_inflation(x, 2022,"US",to_date = 2020)
}
Ты получишь:
df %>%
mutate(across(price.vars, dollars2020,.names ="adjusted_{col}"))
#> year price1 price2 price3 price4 adjusted_price1 adjusted_price2 adjusted_price3 adjusted_price4
#> 1 2003 1.149 1.149 1.163 1.172 1.134999 1.134999 1.148828 1.157719
#> 2 2004 1.169 1.164 1.184 1.180 1.154755 1.149816 1.169572 1.165621
#> 3 2005 1.167 1.166 1.183 1.178 1.152779 1.151792 1.168585 1.163645
Это только часть именования, которая не работает? если да, то измените {col} на {.col}
Может быть, это работает для вас. Вместо пользовательской функции я передал adjust_for_inflation
прямо в вашу dplyr
строку:
Код
library(dplyr)
library(priceR)
price.vars <- df %>% select(-year) %>% names()
df %>% mutate(across(price.vars, ~ adjust_for_inflation(.x, year, "US", to_date = 2020), .names = "adjusted_{col}"))
Выход
# A tibble: 3 x 9
year price1 price2 price3 price4 adjusted_price1 adjusted_price2 adjusted_price3 adjusted_price4
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2003 1.15 1.15 1.16 1.17 1.62 1.62 1.64 1.65
2 2004 1.17 1.16 1.18 1.18 1.60 1.59 1.62 1.62
3 2005 1.17 1.17 1.18 1.18 1.55 1.55 1.57 1.56
Данные
df <- tibble(fread("year price1 price2 price3 price4
2003 1.149 1.149 1.163 1.172
2004 1.169 1.164 1.184 1.18
2005 1.167 1.166 1.183 1.178"))
Спасибо за вашу помощь. Тем не менее, мне нужно, чтобы ввод «год» был записью года для каждого наблюдения, а не фиксированной таким образом. Я не могу привязать его к определенному году. Вы знаете, как я могу сделать его динамичным таким образом?