Замена значений категориальной переменной с использованием условия if-else или любого другого подхода
Это мой набор данных "Опрос", который содержит "Коды" в качестве категориальной переменной.
ID<- seq(1:50)
Codes<- sample(c("Sat1", "Sat2", "A1", "B2", "C2", "D5", "T4"), 50, replace= TRUE)
Survey<- data.frame(Codes)
Уровни в кодах показаны следующим образом:
> levels(Survey$Codes)
[1] "A1" "B2" "C2" "D5" "Sat1" "Sat2" "T4"
Я хочу заменить все значения в столбце "Коды", кроме "Sat1" и "Sat2", на новое значение "Sat3". Другими словами, я ожидаю, что мои уровни в кодах будут:
> levels(Survey$Codes)
[1] “Sat1” “Sat2” “Sat3”
Я знаю первую часть кода к этой проблеме т.е.
levels(Survey$Codes)<- c(levels(Survey$Codes), “Sat3”)
но я застрял, как поступить с остальной частью кода, т.е. как заменить все значения кодов (кроме "Sat1" и "Sat2") на "Sat3". Я думаю использовать здесь выражение if-else, но не уверен, как создать для него коды. Не могли бы вы помочь мне с этим? Спасибо
3 ответа
Как насчет
levels(Survey$Codes)[!grepl("Sat",levels(Survey$Codes))]<-"Sat3"
grepl проверяет наличие определенной строки на ваших уровнях. Выход:
> levels(Survey$Codes)
[1] "Sat3" "Sat1" "Sat2"
> Survey$Codes
[1] Sat3 Sat1 Sat3 Sat2 Sat3 Sat3 Sat3 Sat3 Sat3 Sat3 Sat3 Sat3 Sat1 Sat3 Sat2 Sat3 Sat1 Sat3 Sat1 Sat2 Sat3 Sat3 Sat3 Sat2 Sat3
[26] Sat1 Sat3 Sat3 Sat3 Sat3 Sat3 Sat3 Sat3 Sat2 Sat3 Sat3 Sat1 Sat3 Sat3 Sat3 Sat3 Sat2 Sat3 Sat3 Sat3 Sat2 Sat3 Sat3 Sat3 Sat3
Levels: Sat3 Sat1 Sat2
Попробуй это:
levels(Survey$Codes)[!levels(Survey$Codes) %in% c("Sat1", "Sat2")]<- "Sat3"
#> levels(Survey$Codes)
#[1] "Sat3" "Sat1" "Sat2"
Обратите внимание, что это более общее решение. Например, если уровни интереса не имеют общего характера, grepl
Решение не сработает.
Предполагая, что кадр данных, который вы хотели создать, был:
Survey<- data.frame(ID = seq(1:50),
Codes = sample(c("Sat1", "Sat2", "A1", "B2", "C2", "D5", "T4"), 50, replace= TRUE))
Одним из решений вашей проблемы будет
levels(Survey$Codes)<- c(levels(Survey$Codes), "Sat3")
Survey$Codes[!grepl("Sat1|Sat2", Survey$Codes)] <- "Sat3" #replace if level is either Sat1 or Sat2
И отбросьте уровни факторов, которые больше не встречаются:
Survey$Codes <- factor(Survey$Codes)