R: Создайте Новую Переменную, Используя Значения Из Другой Переменной

#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
 

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