R—按分组对列的值进行排序,以另一个变量为条件

R—按分组对列的值进行排序,以另一个变量为条件,r,R,我有这样一个数据帧(df): 期望输出为: 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 即 按组和列1订购列2 当col1=“b”时,秩为0 将col2的值从最小值排列

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

期望输出为:

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

  • 按组和列1订购列2
  • 当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\u-rank
替换为
densite\u-rank

或者,代替
替换

 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
res%
分组依据(分组,col1)%>%
变异(秩=(col1!='b')*min_秩(col2))
as.data.frame(res)#将是` data.frame'`
#组col1 col2秩
#1 x 22 1
#2xA232
#3x160
#4x180
#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

或使用
数据表

或者像@Arun建议的那样,如果先将
b
设置为零,则可以跳过一个分组步骤

dt[, rank := 0L][col1 != "b", rank := frank(col2, ties.method="dense"), by=group][]

base
R中:

df$rank<-ave(df$col2,df[,1:2],FUN=rank)*(df$col1!="b")

df$rankI无法获取“df”作为数据帧。如何将其作为数据帧?@oercim您可以将其作为.data.frame(res)
执行。更新后的postdf为数据帧,但“秩”列为missing@oercim我获取所有列,检查
as.data.frame(res)
的输出,如果需要更新
df
,则将结果分配给
df%groupby.
而不是
我无法管理的res,我不知道为什么。当我运行代码时,我会在输出中看到rank列。但当我回忆起“df”时,秩列就不见了。
dt[, rank := 0L][col1 != "b", rank := frank(col2, ties.method="dense"), by=group][]
df$rank<-ave(df$col2,df[,1:2],FUN=rank)*(df$col1!="b")