R—按分组对列的值进行排序,以另一个变量为条件
我有这样一个数据帧(df): 期望输出为: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的值从最小值排列
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的值从最小值排列到最大值
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")