You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:54:51