使用带有 tidyverse 的索引手动重新排序因子级别

问题描述 投票:0回答:1

我有一个 data.frame,它在开头包含一个因子变量。我想首先更改因子级别的顺序,然后对 data.frame 进行排序,以按新顺序中的这些因子级别排序。

我的问题是我的真实因子水平的标签非常长,我宁愿按索引重新排序。我确实需要手动重新排序,因为没有适合我需求的自动排序。

我尝试使用带有

fct_reorder()
的索引,但是我得到了难以理解的结果。该因子已重新排序,但不是按照我指定的数字顺序。

如何使用数字来指定因子应如何重新排序?我更喜欢 tidyverse 解决方案。

这是我尝试过的:

# Load tidyverse:
library(tidyverse)

# Create example data frame:

mydf <- data.frame(measure = c("strong", "less strong", "least strong", "fast", "slow"), 
                   cases = c(5,2,11,23,15), 
                   jan = c(2,1,3,4,1), 
                   feb = c(1,0,1,2,3))

mydf <- mydf %>%
         # Convert to factor:
         mutate(measure = factor(measure)) %>%
         # Reorder 'measure' as follows: slow, least strong, less strong, strong, fast
         mutate(measure = fct_reorder(.f = measure, .x = c(4,2,3,5,1))) %>%
         # Arrange data.frame by reordered levels of factor 'measure':
         arrange(measure)

转换为一个因子(在手动排序之前)给了我这个(按字母顺序排列的级别),这是我用来确定应该传递给的索引

fct_reorder()

> levels(mydf$measure)
[1] "fast"         "least strong" "less strong"  "slow"        
[5] "strong"

代码运行没有错误,但我得到了这个,这不是按照我指定的顺序(不太强和最不强的位置错误):

> mydf
       measure cases jan feb
1         slow    15   1   3
2  less strong     2   1   0
3 least strong    11   3   1
4       strong     5   2   1
5         fast    23   4   2

我还尝试用

0
而不是
1
来开始级别编号,这会再次对级别进行重新排序,但仍然不是我想要的顺序。似乎没有任何逻辑(我可以看到)它正在重新排序。

r indices levels r-factor
1个回答
0
投票

和你一样,我发现 fct_order 参数的解释令人困惑。那么为什么不直接使用这个呢:

levels(mydf$measure) <- c('slow', 'least strong', 'less strong', 'strong, fast')
mydf <- mydf %>%  
     arrange(measure)
mydf
#-------------
       measure cases jan feb
1         fast    23   4   2
2 least strong    11   3   1
3  less strong     2   1   0
4         slow    15   1   3
5       strong     5   2   1
© www.soinside.com 2019 - 2024. All rights reserved.