Если вы хотите избежать ifelse
каскадов (например, в случае множества различных кодов), вы можете использовать этот подход:
# Construct example data
df <- data.frame(CourseType = c("C", "O", "O", "OS", "OS", "C"), teacher = c("Joe", "Jane"), stringsAsFactors = FALSE)
df
# CourseType teacher
# 1 C Joe
# 2 O Jane
# 3 O Joe
# 4 OS Jane
# 5 OS Joe
# 6 C Jane
# Do recode by filtering the lines
df$CourseType[df$CourseType == "O"] <- "Online"
df$CourseType[df$CourseType == "OS"] <- "OnSite"
df
# CourseType teacher
# 1 C Joe
# 2 Online Jane
# 3 Online Joe
# 4 OnSite Jane
# 5 OnSite Joe
# 6 C Jane
# Note: The non-matching CourseTypes are left unchanged!
Один недостаток состоит в том, что у вас нет детали else
, в которой вы можете установить значения без перекодирования в значение по умолчанию ... Поэтому лучшим подходом было бы "обогатить" data.frame
, добавив перекодированное значение в новый столбец:
df$CourseTypeRecoded[df$CourseType == "O"] <- "Online"
df$CourseTypeRecoded[df$CourseType == "OS"] <- "OnSite"
df
# CourseType teacher CourseTypeRecoded
# 1 C Joe <NA>
# 2 O Jane Online
# 3 O Joe Online
# 4 OS Jane OnSite
# 5 OS Joe OnSite
# 6 C Jane <NA>
Затем можно установить значения NA
(которые указывают на ошибку перекодирования) на значение по умолчанию, e. г.
df$CourseTypeRecoded[is.na(df$CourseTypeRecoded)] <- "(invalid code)"