Необходимо создать несколько новых переменных одновременно, используя cross() в R.

У меня есть набор данных, в котором мне нужно настроить несколько переменных для инфляции. Это выглядит примерно так.

годцена1цена2цена3цена4
2003 г.1,1491,1491,1631,172
2004 г.1,1691,1641,1841,18
2005 г.1,1671,1661,1831,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 и так далее. Но это не работает. Я был бы очень признателен за любую помощь, которую кто-либо мог бы дать.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
3
0
43
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проблема не в том, что вы используете 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

Спасибо за вашу помощь. Тем не менее, мне нужно, чтобы ввод «год» был записью года для каждого наблюдения, а не фиксированной таким образом. Я не могу привязать его к определенному году. Вы знаете, как я могу сделать его динамичным таким образом?

aul 09.04.2022 23:58

Это только часть именования, которая не работает? если да, то измените {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"))

Другие вопросы по теме