Использование операторов if и создание новых столбцов

#r

#r

Вопрос:

Итак, я хочу перенести записи из одного вектора столбцов (возраст в моем примере) фрейма данных в новый вектор столбцов (опыт, который я определяю как опыт = возраст — годы обучения в школе). Итак, я могу рассчитать количество лет обучения в школе по возрасту, есть три разных диапазона, например, в моем примере люди младше 26 лет учились в школе 14 лет (другие группы можно увидеть в коде ниже). Чтобы найти опыт, я бы просто собрал их вместе.

Я запустил приведенный ниже код, но получил множество ошибок, путаные подсказки, записи о parynthesis, которые я не понял. И он просто вернул мне вектор со всеми записями «возраст-12», а не разные группы, на которые я надеялся (некоторые возраст-10, другие возраст-14).

 if (df[,4] < 26){
   df[,4] - 14
} elseif (df[,4] < 53) {
    df[,4] - 12 
} else (df[,4] - 10)
  

Любая помощь была бы очень признательна!

Ответ №1:

Проблема в том, что if это не векторизовано. Вместо этого вы могли бы использовать ifelse или dplyr::case_when .

Использование некоторых случайных примеров данных:

 set.seed(42)

df <- data.frame(
  a = 1,
  b = 2,
  c = 3,
  d = sample(20:100, 5)
)
df[,4]
#> [1] 68 84 44 93 37

ifelse(df[,4] < 26, df[,4] - 14, ifelse(df[,4] < 53, df[,4] - 12, df[,4] - 10))
#> [1] 58 74 32 83 25

dplyr::case_when(
  df[,4] < 26 ~  df[,4] - 14,
  df[,4] < 53 ~  df[,4] - 12,
  TRUE ~ df[,4] - 10
)
#> [1] 58 74 32 83 25
  

Ответ №2:

Вы могли бы использовать cut плюс некоторую индексацию для достижения этой цели с помощью одной строки кода:

 df$exp <- df$age - c(14, 12, 10)[as.numeric(cut(df$age, c(0, 25, 52, Inf)))]
  

Предположим, что ваши данные выглядят следующим образом:

 set.seed(69)
df <- data.frame(age = sample(16:70, 10))
df
#>    age
#> 1   47
#> 2   32
#> 3   42
#> 4   17
#> 5   63
#> 6   55
#> 7   28
#> 8   54
#> 9   62
#> 10  66
  

Затем, если вы сделали

 df$exp <- df$age - c(14, 12, 10)[as.numeric(cut(df$age, c(0, 25, 52, Inf)))]
  

Тогда df это будет выглядеть так:

 df
#>    age exp
#> 1   47  35
#> 2   32  20
#> 3   42  30
#> 4   17   3
#> 5   63  53
#> 6   55  45
#> 7   28  16
#> 8   54  44
#> 9   62  52
#> 10  66  56
  

Создано 2020-11-10 пакетом reprex (версия 0.3.0)