#r #variables
Вопрос:
Я работаю с набором данных, и мне нужно создать новую переменную (basic_adj) и заполнить ее содержимым другой переменной (employment_adj) при соблюдении ряда условий (indcode >= 2400, Indcode >
Набор данных:
indcode | employment_adj | basic_adj |
---|---|---|
2401 | 29.2 | 29.2 |
3090 | 31.2 | 31.2 |
5200 | 12.4 |
Я попытался сделать это со следующим кодом, но не получаю желаемого результата, который заключается в заполнении нового третьего столбца (basic_adj) содержимым второго столбца (employment_adj), если он соответствует определенным критериям из первого столбца (indcode):
indcode <- c(2401, 3090, 5200)
employment_adj <- c(29.2,31.2,12.4)
df <- data.frame(indcode, employment_adj)
df$basic_adj <- factor (ifelse(df$indcode >= 2400 amp; df$indcode < 3100, "1", NA))
Мы будем признательны за любую помощь.
Комментарии:
1.
ifelse
всегда должно быть три аргумента, вам не хватает своихyes=
иno=
аргументов. Ваш код также не закрывает вызовfactor
. Это сложный код для устранения неполадок, который даже не пройдет первоначальный синтаксический анализатор, пожалуйста, протестируйте (и исправьте) весь ваш код.2. «я не получаю желаемого результата» … как? Что вы получаете и чего ожидаете? Говоря, что это не работает, но не включая текущее и ожидаемое поведение, немного расстраивает то, что вы требуете, чтобы мы все запустили ваш код, чтобы иметь возможность даже начать видеть, в чем заключается ошибка/предупреждение или ошибка. Это (конечно) усугубляется наличием неполного/нефункционального кода.
3. Я не понимаю, почему вы используете
factor(.)
numeric
данные, там это почти всегда неуместно.4. Спасибо вам за ваши отзывы. Я новичок в этом деле, и, очевидно, мне еще многому предстоит научиться. Я обновил свой код и предоставил более подробное объяснение.
Ответ №1:
В базе R. есть несколько способов сделать это. 2 Проблемы с вашей попыткой заключаются в том, что (а) ifelse
функция принимает 3 аргумента — вам нужно указать, что функция должна возвращать, если утверждение истинно и ложно. (б) вам нужно каким-то образом перебрать каждый элемент вектора инкодирования.
Например, с помощью transform
:
indcode <- c(2401, 3090, 5200)
employment_adj <- c(29.2,31.2,12.4)
df <- data.frame(indcode, employment_adj)
df <- transform(df, basic_adj = ifelse(indcode >= 2400 amp; indcode < 3100, 1, 0))
Или вы можете «прокрутить» каждый элемент вектора, используя sapply
df$basic_adj = sapply(1:nrow(df), function(i) ifelse(df$indcode[i] >= 2400 amp; df$indcode[i] < 3100, 1, 0))
Большинство пользователей R выполняют многие из этих типов преобразований, используя dplyr
data.table
пакеты или, чтобы сделать работу с кадрами данных быстрее/проще. Вот как вы могли бы это сделать в data.table
:
library(data.table)
indcode <- c(2401, 3090, 5200)
employment_adj <- c(29.2,31.2,12.4)
df <- data.frame(indcode, employment_adj)
dat <- as.data.table(df)
dat[, basic_adj := ifelse(indcode >= 2400 amp; indcode < 3100, 1, 0)]
> dat
indcode employment_adj basic_adj
1: 2401 29.2 1
2: 3090 31.2 1
3: 5200 12.4 0
Стоит потратить время на изучение одного из этих пакетов, если вы используете много данных.