#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)