使用 if-else 条件或任何其他方法替换分类变量的值
Replacing the values of a categorical variable using if-else condition or any other approach
这是我的数据集“调查”,其中包含“代码”作为分类变量。
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 语句,但不确定如何为它构建代码。你能帮我解决这个问题吗?谢谢
怎么样
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))
您的问题的一个解决方案是添加一个名为 "Sat3":
的新级别
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 <- droplevels(Survey$Codes)
试试这个:
levels(Survey$Codes)[!levels(Survey$Codes) %in% c("Sat1", "Sat2")]<- "Sat3"
#> levels(Survey$Codes)
#[1] "Sat3" "Sat1" "Sat2"
请注意,这是一个更通用的解决方案。例如,如果感兴趣的级别没有任何共同特征,则 grepl
解决方案将不起作用。
这是我的数据集“调查”,其中包含“代码”作为分类变量。
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 语句,但不确定如何为它构建代码。你能帮我解决这个问题吗?谢谢
怎么样
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))
您的问题的一个解决方案是添加一个名为 "Sat3":
的新级别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 <- droplevels(Survey$Codes)
试试这个:
levels(Survey$Codes)[!levels(Survey$Codes) %in% c("Sat1", "Sat2")]<- "Sat3"
#> levels(Survey$Codes)
#[1] "Sat3" "Sat1" "Sat2"
请注意,这是一个更通用的解决方案。例如,如果感兴趣的级别没有任何共同特征,则 grepl
解决方案将不起作用。