提问人:Dan 提问时间:8/8/2023 最后编辑:thelatemailDan 更新时间:8/8/2023 访问量:63
显示错误级别数的因素
Factors showing wrong number of levels
问:
我从一些气候数据中创建了一个数据框,并希望通过三个变量对其进行分析,每个变量有三个因素。我在绘制其中一个变量时遇到了问题,所以我向后查找错误,并找到以下内容:
> 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"
所以我真的有点不知所措,尽管问题似乎与因素中的空白有关。关于如何处理这个问题有什么建议吗?
答:
0赞
Elin
8/8/2023
#1
测试数据集和(看似)真实数据集的不同之处在于测试数据集没有空格。您不会显示您如何读取数据,无论数据是来自 csv 文件还是其他来源。你认为空格是问题所在,这是正确的。
关键问题是,在创建因子时,它们使用实际字符串来创建水平。字符串包含空格,因此这是所创建关卡的一部分。
让我们在基础 R 中执行此操作
batch3$time <- as.character(batch3$time) |> trimws() |> as.factor()
它的作用是:
- 将变量转换为字符而不是因子
- 修剪空白
- 将其转换回因子(现在的水平基于修剪后的值)
评论
is.character(factor("a"))
返回,因此您修复这些值的尝试将不起作用。尝试单独修复变量,而不使用FALSE
batch3$time
mutate_if
mutate_if
mutate(across(…), …)
batch3 <- batch3 %>% mutate_if(…)
levels(whatever) <- trimws(levels(whatever))
..这个问题在 SO 上存在许多重复项。