R:根据因子中的第一个数字对因子向量的水平进行排序

R: order the level of a factor vector based on the first number in the factor

我想根据因子中的第一个数字对因子向量的水平进行排序。

示例如下:

FC <- factor(c("R: 12.22 P: 170.0", "R: 12.98 P: 189.1", "R: 2.55 P: 286", "R: 12.22 P: 170.0", "R: 12.98 P: 189.1", "R: 2.55 P: 286"))

## the original level oder 
FC
[1] R: 12.22 P: 170.0 R: 12.98 P: 189.1 R: 2.55 P: 286    R: 12.22 P: 170.0 R: 12.98 P: 189.1 R: 2.55 P: 286   
Levels: R: 12.22 P: 170.0 R: 12.98 P: 189.1 R: 2.55 P: 286

我希望级别按照示例中因子中的第一个数字排序,即按照2.5512.2212.98[=16的顺序=]

结果如下:

## ordered level
FC 
Levels: R: 2.55 P: 286 R: 12.22 P: 170.0 R: 12.98 P: 189.1

我在想什么提取因子向量中的第一个数字,然后对因子进行排序。

fistNum <- read.table(text = levels(FC))[[2]]

fistNum 
[1] 12.22 12.98  2.55

然后我不知道如何继续。感谢您的帮助。

是这样的吗?

levels(FC) <- FC[order(readr::parse_number(as.character(levels(FC))))]
levels(FC)

#[1] "R: 2.55 P: 286"    "R: 12.22 P: 170.0" "R: 12.98 P: 189.1"

readr::parse_number 将从向量 FC 中提取第一个数字,我们 order 这些数字并分配级别

在基地

FC <- factor(c("R: 12.22 P: 170.0", "R: 12.98 P: 189.1", "R: 2.55 P: 286", "R: 12.22 P: 170.0", "R: 12.98 P: 189.1", "R: 2.55 P: 286"))

# Coherce to character for gsub
cc <- paste(FC)
cc
#> [1] "R: 12.22 P: 170.0" "R: 12.98 P: 189.1" "R: 2.55 P: 286"   
#> [4] "R: 12.22 P: 170.0" "R: 12.98 P: 189.1" "R: 2.55 P: 286"

# Get first value in each string
fv <- gsub(pattern = ".*\s([0-9.]*)\s.*", replacement = "\1", x = cc)
fv
#> [1] "12.22" "12.98" "2.55"  "12.22" "12.98" "2.55"

df <- data.frame(cbind(cc, fv))
df
#>                  cc    fv
#> 1 R: 12.22 P: 170.0 12.22
#> 2 R: 12.98 P: 189.1 12.98
#> 3    R: 2.55 P: 286  2.55
#> 4 R: 12.22 P: 170.0 12.22
#> 5 R: 12.98 P: 189.1 12.98
#> 6    R: 2.55 P: 286  2.55

FC <- factor(FC, levels = unique(df[order(as.numeric(df$fv)),"cc"]))
FC
#> [1] R: 12.22 P: 170.0 R: 12.98 P: 189.1 R: 2.55 P: 286    R: 12.22 P: 170.0
#> [5] R: 12.98 P: 189.1 R: 2.55 P: 286   
#> Levels: R: 2.55 P: 286 R: 12.22 P: 170.0 R: 12.98 P: 189.1

谢谢@Ronak Shah。根据您的回答,我添加了另一个基于 R 的答案。

levels(FC) <- levels(FC)[order(read.table(text = levels(FC), fill = TRUE)[[2]])]

我们可以使用 fct_relevel

library(forcats)
FC2 <- fct_relevel(FC, gtools::mixedsort(levels(FC)))
levels(FC2)
[1] "R: 2.55 P: 286"    "R: 12.22 P: 170.0" "R: 12.98 P: 189.1"