【问题标题】:R: order the level of a factor vector based on the first number in the factorR:根据因子中的第一个数字对因子向量的水平进行排序
【发布时间】:2021-11-14 06:32:33
【问题描述】:

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

下面是例子:

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

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

【问题讨论】:

    标签: r sorting levels


    【解决方案1】:

    这样的?

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

    【讨论】:

      【解决方案2】:

      在基地

      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
      

      【讨论】:

        【解决方案3】:

        感谢@Ronak Shah。根据您的回答,我添加了另一个带有 base R 的答案。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-12-08
            • 1970-01-01
            • 2017-07-18
            • 2019-03-18
            • 1970-01-01
            • 2021-11-17
            • 1970-01-01
            相关资源
            最近更新 更多