R语言因子水平数量异常:time列冗余空格无法清理
问题:因子水平含多余空格无法清理,导致分类异常
基于气候数据创建了DataFrame,计划用三个各含3个因子的变量做分析,可视化时发现time列的因子被错误拆分为多个重复水平:
> levels(batch3$site) [1] " Site_1" " Site_2" " Site_3" > levels(batch3$RCP) [1] "00" "26" "85" > levels(batch3$time) [1] "baseline " "baseline " [3] "baseline " "end " [5] "end " "end " [7] "mid " "mid " [9] "mid "
尝试将time转回字符型后用以下代码清理空格,但无效果:
batch3 %>% mutate_if(is.character, trimws)
三个变量分布规律一致,仅time列存在该问题,推测是因子中的空格无法被正常清理。尝试用测试数据集复现问题未成功,测试代码如下:
test_df <- data.frame(a = as.factor(c('Site1', 'Site2', 'Site3','Site1', 'Site2', 'Site3','Site1', 'Site2', 'Site3')), b = as.factor(c('00','00','00','26','26','26','85','85','85')), c = as.factor(c('baseline', 'mid','end','baseline', 'mid','end','baseline', 'mid','end')), d = c(45, 56, 54, 57, 59, 77, 37, 21, 44))
测试数据集预期因子水平:
> levels(test_df$a) [1] "Site1" "Site2" "Site3" > levels(test_df$b) [1] "00" "26" "85" > levels(test_df$c) [1] "baseline" "end" "mid"
解决建议
- 直接操作因子水平(最有效):不用先转字符,直接清理并重新赋值因子水平,重复水平会自动合并:
# 清理time列的因子水平空格 levels(batch3$time) <- trimws(levels(batch3$time)) # 移除冗余的重复水平 batch3$time <- droplevels(batch3$time) - 处理非标准空格:如果
trimws无效,可能是存在全角空格、制表符等非标准空白字符,用正则替换所有空白:levels(batch3$time) <- gsub("^\\s+|\\s+$", "", levels(batch3$time)) # 若内部有多个空格,先合并再清理 levels(batch3$time) <- trimws(gsub("\\s+", " ", levels(batch3$time))) - 同步处理site列:site列存在前置空格,可用同样方法清理:
levels(batch3$site) <- trimws(levels(batch3$site)) - 从源头避免问题:后续读取数据时,先以字符型读取(
stringsAsFactors = FALSE),清理空格后再转换为因子,避免初始因子水平异常。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

