【问题标题】:R row-wise sort on specific columnsR 在特定列上按行排序
【发布时间】:2020-02-24 16:17:43
【问题描述】:

我想使用特定列进行逐行排序,但也保留原始 df 中的所有列。

数据:

df <- structure(list(C1 = c("ABC", "XYZ", "DEF"),
                           C2 = c("ZLO", "BCD", "PQR"),
                           C3 = c("E1", "E2", "E3")),
                           class = "data.frame", row.names = c(NA, -3L))

Desired output:
C1  C2  C3
ABC ZLO E1
BCD XYZ E2
DEF PQR E3

我尝试使用:

df <- t(apply(df[1:2], 1, 
                   FUN=function(x) sort(x, decreasing=FALSE)))

但它只返回前两列,我需要帮助: a) 向量化它 b) 保留所有列

【问题讨论】:

    标签: r sorting vectorization


    【解决方案1】:
    df <- structure(list(C1 = c("ABC", "XYZ", "DEF"),
                         C2 = c("ZLO", "BCD", "PQR"),
                         C3 = c("E1", "E2", "E3")),
                    class = "data.frame", row.names = c(NA, -3L))
    

    解决方案使用dplyrtidyr 将数据带入长格式,按行分组并按字符串排序,然后将其恢复为宽格式:

    library(dplyr)
    library(tidyr)
    

    编辑:

    编辑代码,C3 保持原样

    df %>% 
      mutate(ID = row_number()) %>% 
      pivot_longer(cols=-c(ID, C3)) %>% 
      group_by(ID) %>% 
      arrange(value) %>% 
      mutate(name = paste0("C", row_number())) %>% 
      pivot_wider(names_from = name,
                  values_from = value) %>% 
      select(C1, C2, C3)
    
    
    # Groups:   ID [3]
         ID C1    C2    C3   
      <int> <chr> <chr> <chr>
    1     1 ABC   ZLO   E1   
    2     2 BCD   XYZ   E2   
    3     3 DEF   PQR   E3 
    

    【讨论】:

    • 原始列 C3 (E1, E2, E3) 不应排序,应保持原样。
    • 感谢您的评论!为了完整起见,我编辑了我的示例。您的解决方案显然是更可取的!
    【解决方案2】:

    不分配给df,只分配给您要排序的列。

    df[1:2] <- t(apply(df[1:2], 1, 
                  FUN=function(x) sort(x, decreasing=FALSE)))
    

    或者写得更简单:

    to_sort <- 1:2
    df[to_sort] <- t(apply(df[to_sort], 1, sort, decreasing = FALSE))
    

    【讨论】:

      【解决方案3】:

      这是另一个解决方案:

        librar(dplyr)
        df <- apply(df[1:2], 1, sort) %>% 
          t() %>% 
          cbind(df[3]) %>% 
          as.data.frame() %>% 
          setNames(paste0("C", 1:length(.)))
      
      # output
           C1  C2 C3
        1 ABC ZLO E1
        2 BCD XYZ E2
        3 DEF PQR E3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多