У меня есть набор данных с несколькими годами и переменными. Я бы указал, сколько каждого из них, но я пытаюсь создать сценарий, который может работать без необходимости копировать и вставлять каждый блок для каждого года/переменной, поэтому, надеюсь, код будет работать независимо от этих спецификаций. По сути, для каждой переменной у меня есть завышенный аналог, например INCOME и INCOME_INFLATED, и я хочу создать увеличенную вручную версию INCOME (INCOME_MANUAL) и сравнить ее с INCOME_INFLATED.
По сути, вот пример моих входных данных:
Вот как я хотел бы, чтобы мои выходные данные выглядели так:
Где доход_вручную — это доход 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, поэтому прошу прощения за то, что немного запутался.
Ваши выходные данные не включают отдельные файлы за отдельные годы, поэтому неясно, в чем заключается ваш вопрос. Если data
— это фрейм данных, представленный в качестве вашего примера, data$income_manual <- data$income * data$CPIU
добавит последний столбец, который вы запрашиваете. Если вам нужны отдельные фреймы данных для каждого года, это несложно, но это должно быть решено путем создания списка фреймов данных, а не отдельных фреймов данных. Использование assign()
только усложнит ваш код.
@dcarlson Код, который вы предоставили, был моим первоначальным инстинктом, но я ищу способ сделать это для многих переменных, а не только для дохода. Копирование и вставка одной и той же строки может стать довольно утомительным для 40+ переменных, поэтому я пытаюсь использовать цикл, чтобы эта функция выполнялась для списка переменных. Как вы думаете, это возможно?
@Parfait Я не уверен, что вы подразумеваете под более чем двумя переменными. Вы имеете в виду другие переменные, кроме дохода? Или вы имеете в виду больше наблюдений для yield_manual? Я хочу, чтобы income_manual
было создано путем умножения income
и CPIU
. Но это усложняется тем, что я хочу сделать это для многих переменных, а не только income
.
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 ...
Я не понимаю вопроса. Можете ли вы показать пример
income_manual
для более чем двух переменных?