R:根据因子向量中的第一个数字排序因子向量的层次



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

示例如下:

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的顺序排序

结果如下:

## 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这些数字并分配级别

我们可以使用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"

In base

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]])]

最新更新