R语言技术问询:基于指定条件修改Unit列的因子水平
解决因子列用case_when替换后出现NA的问题
先加载你的示例数据:
df <- structure(list(Species = c("KS", "KS", "BBA", "BBA"), Unit = structure(c(1L, 2L, 1L, 2L), .Label = c("AON", "PFC"), class = "factor"), Month = c(NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, -4L))
问题原因
你用case_when时只定义了满足Species == "KS" & Unit == "PFC"的替换规则,没有添加默认返回逻辑,导致所有不匹配条件的行都被赋值为NA。另外因为Unit是因子类型,即便替换值在原因子水平内,缺少默认规则仍会出现异常。
解决方案
方法一:给case_when添加默认返回原值的规则
直接在case_when末尾加上TRUE ~ Unit,让不满足条件的行保留原Unit值:
library(dplyr) df <- df %>% mutate(Unit = case_when( Species == "KS" & Unit == "PFC" ~ "AON", TRUE ~ Unit # 所有不满足上面条件的行,返回原Unit ))
方法二:先转字符再处理(更灵活)
如果后续需要添加新的因子水平,先把Unit转为字符型处理,完成后再转回因子:
df <- df %>% mutate(Unit = as.character(Unit), Unit = case_when( Species == "KS" & Unit == "PFC" ~ "AON", TRUE ~ Unit ), Unit = as.factor(Unit))
处理后结果
运行任意一种方法后,数据框会变成:
> df Species Unit Month 1 KS AON NA 2 KS AON NA 3 BBA AON NA 4 BBA PFC NA
内容的提问来源于stack exchange,提问作者user303287
相关产品推荐
相关产品推荐

