使用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)
答
试试这个:
levels(Survey$Codes)[!levels(Survey$Codes) %in% c("Sat1", "Sat2")]<- "Sat3"
#> levels(Survey$Codes)
#[1] "Sat3" "Sat1" "Sat2"
请注意,这是一个更一般的解决方案。例如,如果感兴趣的级别没有任何共同特征,那么grepl
解决方案将不起作用。
+0
这是我一直在寻找的简单逻辑。 – Rookie
工程很棒。谢谢 – Rookie