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.55
、12.22
和12.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"
我想根据因子中的第一个数字对因子向量的水平进行排序。
示例如下:
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.55
、12.22
和12.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"