Замена значений категориальной переменной с использованием условия 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)
Другие вопросы по тегам