显示错误级别数的因素

Factors showing wrong number of levels

提问人:Dan 提问时间:8/8/2023 最后编辑:thelatemailDan 更新时间:8/8/2023 访问量:63

问:

我从一些气候数据中创建了一个数据框,并希望通过三个变量对其进行分析,每个变量有三个因素。我在绘制其中一个变量时遇到了问题,所以我向后查找错误,并找到以下内容:

> 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                            "

如您所见,由于某种原因,第三组被分成三组。我尝试使用以下方法将它们恢复为字符以删除任何空格:

batch3 %>%
  mutate_if(is.character, trimws)

但没有运气,结果是一样的。这三个因子在数据集中的分布方式相同,但这个问题只存在于“时间”列中,我唯一能看到的是这些因子中的大空白,这些空白似乎难以删除。

我确实尝试通过制作一个较小的数据框来重现这个问题,但问题没有出现,而且原始数据集有大约 480 行数据,所以我无法轻松剪切和粘贴。

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" 

所以我真的有点不知所措,尽管问题似乎与因素中的空白有关。关于如何处理这个问题有什么建议吗?

R 因子

评论

1赞 thelatemail 8/8/2023
is.character(factor("a"))返回,因此您修复这些值的尝试将不起作用。尝试单独修复变量,而不使用FALSEbatch3$timemutate_if
0赞 IRTFM 8/8/2023
尾随空格数量不同。
0赞 Limey 8/8/2023
另外,请注意,它已被取代,无论您采用哪种方法,您都需要将结果分配给某些东西 - 例如 .我同意@IRTFM,根本问题是尾随空格的数量不同,所以这是一个错别字,尽管它是在变量的原始构造中还是在尝试修复中都没有意义。mutate_ifmutate(across(…), …)batch3 <- batch3 %>% mutate_if(…)
0赞 IRTFM 8/8/2023
levels(whatever) <- trimws(levels(whatever))..这个问题在 SO 上存在许多重复项。
0赞 Dan 8/8/2023
尾随空格是我唯一突出的东西,可能是从中下载它们的 CSV 文件的产物?无论如何,解决如下: batch3$time <- trimws(batch3$time, which = c(“right”)) batch3

答:

0赞 Elin 8/8/2023 #1

测试数据集和(看似)真实数据集的不同之处在于测试数据集没有空格。您不会显示您如何读取数据,无论数据是来自 csv 文件还是其他来源。你认为空格是问题所在,这是正确的。

关键问题是,在创建因子时,它们使用实际字符串来创建水平。字符串包含空格,因此这是所创建关卡的一部分。

让我们在基础 R 中执行此操作

batch3$time <- as.character(batch3$time) |> trimws() |> as.factor() 

它的作用是:

  1. 将变量转换为字符而不是因子
  2. 修剪空白
  3. 将其转换回因子(现在的水平基于修剪后的值)