使用if-else条件或任何其他方法替换分类变量的值

问题描述:

这是我的数据集“Survey”,其中包含“Codes”作为分类变量。使用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”) 

,但我坚持了如何使用的其余部分进行代码,即如何用“Sat3”代替所有的代码值(“Sat1”和“Sat2”除外)。我在考虑在这里使用if-else语句,但不知道如何为它构造代码。你能帮我解决这个问题吗?由于

如何

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 

假设你想创建数据帧是:

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) 
+0

工程很棒。谢谢 – Rookie

试试这个:

levels(Survey$Codes)[!levels(Survey$Codes) %in% c("Sat1", "Sat2")]<- "Sat3" 

#> levels(Survey$Codes) 
#[1] "Sat3" "Sat1" "Sat2" 

请注意,这是一个更一般的解决方案。例如,如果感兴趣的级别没有任何共同特征,那么grepl解决方案将不起作用。

+0

这是我一直在寻找的简单逻辑。 – Rookie