通过分组(以另一个变量为条件)对列进行R排序

标签 r

我有这样一个数据框(df):

group col1 col2  
x      a    22    
x      a    23  
x      b    16  
x      b    18  
y      a    11  
y      a    12  
y      a    16  
y      a    45  
y      b    24  

所需的输出是:
group col1 col2 rank 
x      a    22  1  
x      a    23  2
x      b    16  0
x      b    18  0
y      a    11  1
y      a    12  2
y      a    16  3
y      a    45  4
y      b    24  0


  • 按组和col1排序col2
  • ,当col1 =“b”时,排名为0
  • col2的
  • 等级值从最小到最大

  • 如何使用R做到这一点?我会很高兴为您提供任何帮助。非常感谢。

    最佳答案

    你可以试试

    library(dplyr)
     df %>%
        group_by(group, col1) %>% 
        mutate(rank=replace(min_rank(col2), col1=='b',0) )
    #    group col1 col2 rank
    #1     x    a   22    1
    #2     x    a   23    2
    #3     x    b   16    0
    #4     x    b   18    0
    #5     y    a   11    1
    #6     y    a   12    2
    #7     y    a   16    3
    #8     y    a   45    4
    #9     y    b   24    0
    

    如果您不希望出现平局时的等级差距,请将min_rank替换为dense_rank
    或者,代替replace
     res <- df %>% 
              group_by(group, col1) %>% 
              mutate(rank=(col1!='b')*min_rank(col2))
    
     as.data.frame(res) #would be `data.frame`
     #    group col1 col2 rank
     #1     x    a   22    1
     #2     x    a   23    2
     #3     x    b   16    0
     #4     x    b   18    0
     #5     y    a   11    1
     #6     y    a   12    2
     #7     y    a   16    3
     #8     y    a   45    4
     #9     y    b   24    0
    

    关于通过分组(以另一个变量为条件)对列进行R排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29060467/

    相关文章:

    r - Shiny 的仪表板-显示专用的“正在加载..”页面,直到完成数据的初始加载

    r - ggplot 中不同列值并排放置的多个箱线图

    r - auto.arima() 中的 BoxCox 转换 : Does it also transform the residuals?

    r - ggplot2 移动构面布局

    r - 循环在ddply中创建新变量

    r - 在 R 中处理时间戳

    r - 如何用多个变量和个体的 IQR 内的值替换异常值

    c++ - Rcpp:我的距离矩阵程序比包中的函数慢

    arrays - 如何在 data.frame 的两列上使用 ggmap 的 revgeocode?

    r - 病例对照研究 "exact"与重叠时间间隔匹配