Циклы и создание новых переменных в R

У меня есть набор данных с несколькими годами и переменными. Я бы указал, сколько каждого из них, но я пытаюсь создать сценарий, который может работать без необходимости копировать и вставлять каждый блок для каждого года/переменной, поэтому, надеюсь, код будет работать независимо от этих спецификаций. По сути, для каждой переменной у меня есть завышенный аналог, например INCOME и INCOME_INFLATED, и я хочу создать увеличенную вручную версию INCOME (INCOME_MANUAL) и сравнить ее с INCOME_INFLATED.

По сути, вот пример моих входных данных:

год доход доход_инфляция ЦРП 2000 г. 1500 3000 2 2001 г. 1000 1500 1,5 2002 г. 2000 г. 6000 3

Вот как я хотел бы, чтобы мои выходные данные выглядели так:

год доход доход_инфляция ЦРП доход_ручной 2000 г. 1500 3000 2 3000 2001 г. 1000 1500 1,5 1500 2002 г. 2000 г. 6000 3 6000

Где доход_вручную — это доход x CPIU. CPIU — это числовая переменная с уникальным значением для каждого года. Это очень просто для одной или двух переменных, но мне трудно понять, как это сделать для списка из 40+ переменных без необходимости копировать и вставлять код для каждой переменной.

Я могу легко создать список соответствующих переменных, я просто не знаю, как создать цикл, который позволяет именовать и создавать новую переменную, чтобы пользователь мог просто ввести свой файл данных и запустить его.

Этот код успешно создает новые файлы данных, отфильтрованные по годам, с именем «data_[YEAR]». (years — это список уникальных значений переменной YEAR.)

for (y in years[]) {
  dy <- data %>% filter(YEAR == y)
  assign(paste0("data_", y), dy)
}
remove(dy)

Но когда я пытаюсь применить ту же логику к переменной, она не работает. (vars — это список соответствующих переменных.)

for (v in vars[]) {
  data <- data %>% mutate(x = v * CPIU)
  assign(paste0(v, "_manual"), data$x)
}

Это дает мне следующую ошибку:

Error in `mutate()`:
! Problem while computing `x = v * CPIU`.
Caused by error in `v * CPIU`:
! non-numeric argument to binary operator

Я довольно привык выполнять эти операции «создания новых объектов» в сценариях bash, но не так много в R, поэтому я не уверен, как вызывать такой «словарь». По сути, как я могу заставить R понимать «v» как фактическую переменную, а не имя переменной как строку символов?

По сути, я хочу выполнить следующую операцию:

data$income_manual <- data$income * data$CPIU

для многих переменных без необходимости копировать и вставлять эту строку снова и снова.

Дайте мне знать, если нужна дополнительная информация или фон! Спасибо.

Я также знаю, что здесь есть много вопросов, похожих на этот, но я не могу понять, как адаптировать его к своей работе. Я все еще относительно новичок в R, поэтому прошу прощения за то, что немного запутался.

Я не понимаю вопроса. Можете ли вы показать пример income_manual для более чем двух переменных?

Parfait 09.01.2023 22:48

Ваши выходные данные не включают отдельные файлы за отдельные годы, поэтому неясно, в чем заключается ваш вопрос. Если data — это фрейм данных, представленный в качестве вашего примера, data$income_manual <- data$income * data$CPIU добавит последний столбец, который вы запрашиваете. Если вам нужны отдельные фреймы данных для каждого года, это несложно, но это должно быть решено путем создания списка фреймов данных, а не отдельных фреймов данных. Использование assign() только усложнит ваш код.

dcarlson 09.01.2023 22:50

@dcarlson Код, который вы предоставили, был моим первоначальным инстинктом, но я ищу способ сделать это для многих переменных, а не только для дохода. Копирование и вставка одной и той же строки может стать довольно утомительным для 40+ переменных, поэтому я пытаюсь использовать цикл, чтобы эта функция выполнялась для списка переменных. Как вы думаете, это возможно?

Danika 09.01.2023 22:57

@Parfait Я не уверен, что вы подразумеваете под более чем двумя переменными. Вы имеете в виду другие переменные, кроме дохода? Или вы имеете в виду больше наблюдений для yield_manual? Я хочу, чтобы income_manual было создано путем умножения income и CPIU. Но это усложняется тем, что я хочу сделать это для многих переменных, а не только income.

Danika 09.01.2023 23:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

IIUC — вы можете назначать новые столбцы фрейма данных из блока переменных, используя матричные операции:

relevant_vars <- c("income", ...)

data[paste0(relevant_vars, "_manual")] <- data[relevant_vars] * data$CPIU

Чтобы продемонстрировать с mtcars:

relevant_vars <- names(mtcars)
mtcars$CPIU <- runif (nrow(mtcars))
  
mtcars[paste0(relevant_vars, "_manual")] <- mtcars[relevant_vars] * mtcars$CPIU

str(mtcars)
'data.frame':   32 obs. of  24 variables:
 $ mpg        : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl        : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp       : num  160 160 108 258 360 ...
 $ hp         : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat       : num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt         : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec       : num  16.5 17 18.6 19.4 17 ...
 $ vs         : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am         : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear       : num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb       : num  4 4 1 1 2 1 4 2 2 4 ...
 $ CPIU       : num  0.699 0.616 0.111 0.658 0.957 ...
 $ mpg_manual : num  14.68 12.93 2.54 14.09 17.9 ...
 $ cyl_manual : num  4.194 3.695 0.446 3.95 7.658 ...
 $ disp_manual: num  111.8 98.5 12 169.9 344.6 ...
 $ hp_manual  : num  76.9 67.7 10.4 72.4 167.5 ...
 $ drat_manual: num  2.726 2.402 0.429 2.028 3.015 ...
 $ wt_manual  : num  1.831 1.771 0.259 2.117 3.293 ...
 $ qsec_manual: num  11.51 10.48 2.07 12.8 16.29 ...
 $ vs_manual  : num  0 0 0.111 0.658 0 ...
 $ am_manual  : num  0.699 0.616 0.111 0 0 ...
 $ gear_manual: num  2.796 2.464 0.446 1.975 2.872 ...
 $ carb_manual: num  2.796 2.464 0.111 0.658 1.915 ...

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