根据另一列的排名将列添加到R中的数据框

Rmg*_*Rmg 6 r dataframe

这是我的数据的可重现的例子.对于以下数据框:

df <- data.frame(Subject = c('John', 'John', 'John', 'John','Mary', 'Mary', 'Mary', 'Mary'),
                 SNR = c(-4,-4,0,4,0,4,4,8))
Run Code Online (Sandbox Code Playgroud)

我想添加一个列'rank',它按主题提供SNR的排名,因此它看起来像这样:

Subject   SNR   Rank
John      -4    1
John      -4    1
John       0    2
John       4    3
Mary       0    1
Mary       4    2
Mary       4    2
Mary       8    3
Run Code Online (Sandbox Code Playgroud)

我尝试过使用:

dfNew <- transform(df, Rank = ave(SNR, Subject, FUN = function(x) rank(x, ties.method = "first")))
Run Code Online (Sandbox Code Playgroud)

但我得到以下内容:

Subject   SNR   Rank
John      -4    1
John      -4    2
John       0    3
John       4    4
Mary       0    1
Mary       4    2
Mary       4    3
Mary       8    4   
Run Code Online (Sandbox Code Playgroud)

我也试过使用不同的ties.method选项,但没有一个给我我想要的东西(即,仅从1-3排名).

任何帮助将非常感激!

989*_*989 2

在 R 基数中使用aggregateand :factor

ag <- aggregate(SNR~Subject, df, function(x) as.numeric(factor(x)))
df$rank <- c(t(ag[,-1]))

  Subject SNR rank
1    John  -4    1
2    John  -4    1
3    John   0    2
4    John   4    3
5    Mary   0    1
6    Mary   4    2
7    Mary   4    2
8    Mary   8    3
Run Code Online (Sandbox Code Playgroud)