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

问题描述 投票:0回答:3

这是我的数据集“Survey”,其中包含“代码”作为分类变量。

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"  

我想用新值“Sat3”替换除“Sat1”和“Sat2”之外的代码列中的所有值。换句话说,我希望我的代码级别为:

> levels(Survey$Codes)
[1] “Sat1” “Sat2” “Sat3”

我知道这个问题的第一部分代码,即

levels(Survey$Codes)<- c(levels(Survey$Codes), “Sat3”)

但我被困在如何继续其余的代码,即如何用“Sat3”替换代码的所有值(“Sat1”和“Sat2”除外)。我想在这里使用if-else语句但不确定如何为它构建代码。你能帮帮我吗?谢谢

r if-statement r-factor
3个回答
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

0
投票

假设您要创建的数据框是:

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
投票

试试这个:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.