【问题标题】:How to reorder column values ascending order that are seperated by "," and only keep first value in R如何重新排序由“,”分隔的列值升序,并且只保留R中的第一个值
【发布时间】:2021-11-12 20:51:56
【问题描述】:

我在 df 中有一个包含如下值的列:

ID
2
NA
1
3
4
5,7
9,6,10
12
15
16
17
NA
19
22,23

我想根据升序对每一行重新排序。注意 - 此列是基于“字符”的字段,并且某些行的顺序已经正确。

从那里,我只想保留第一个值并删除其他值。

期望的输出:

ID
2
NA
1
3
4
5
6
12
15
16
17
NA
19
22

【问题讨论】:

    标签: r dataframe dplyr tidyr


    【解决方案1】:

    您可以用逗号分割数据,sort 他们并提取第一个值。

    df$ID <- sapply(strsplit(df$ID, ','), function(x) sort(as.numeric(x))[1])
    
    #   ID
    #1   2
    #2  NA
    #3   1
    #4   3
    #5   4
    #6   5
    #7   6
    #8  12
    #9  15
    #10 16
    #11 17
    #12 NA
    #13 19
    #14 22
    

    几个tidyverse 替代方案。

    library(tidyverse)
    
    #1.
    #Same as base R but in tidyverse
    df %>% mutate(ID = map_dbl(str_split(ID, ','), ~sort(as.numeric(.x))[1]))
    
    #2.
    df %>%
      mutate(row = row_number()) %>%
      separate_rows(ID, sep = ',', convert = TRUE) %>%
      group_by(row) %>%
      summarise(ID = min(ID)) %>%
      select(-row)
    

    【讨论】:

      【解决方案2】:

      这是另一个 tidyverse 解决方案:利用 (dyplrpurrrstringrreadr

      library(tidyverse)
      df %>% 
          mutate(ID = map_chr(str_split(ID, ","), ~ 
                                 toString(sort(as.numeric(.x)))),
                 ID = parse_number(ID))
      )
      

      输出:

         ID
      1   2
      2  NA
      3   1
      4   3
      5   4
      6   5
      7   6
      8  12
      9  15
      10 16
      11 17
      12 NA
      13 19
      14 22
      

      【讨论】:

        【解决方案3】:

        我们可以使用minimum 代替排序/提取:

        DF <- transform(DF, ID=sapply(strsplit(ID, ','), \(x) min(as.double(x))))
        DF
        #    ID
        # 1   2
        # 2  NA
        # 3   1
        # 4   3
        # 5   4
        # 6   5
        # 7   6
        # 8  12
        # 9  15
        # 10 16
        # 11 17
        # 12 NA
        # 13 19
        # 14 22
        

        【讨论】:

          【解决方案4】:

          我们可以使用str_extract

          library(stringr)
          library(dplyr)
          df1 %>%
              mutate(ID = as.numeric(str_extract(ID, '\\d+')))
          

          -输出

             ID
          1   2
          2  NA
          3   1
          4   3
          5   4
          6   5
          7   9
          8  12
          9  15
          10 16
          11 17
          12 NA
          13 19
          14 22
          

          数据

          df1 <- structure(list(ID = c("2", NA, "1", "3", "4", "5,7", "9,6,10", 
          "12", "15", "16", "17", NA, "19", "22,23")), class = "data.frame", row.names = c(NA, 
          -14L))
          

          【讨论】:

            猜你喜欢
            • 2019-08-10
            • 2019-12-13
            • 1970-01-01
            • 1970-01-01
            • 2014-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多