这是我的数据的可重现的例子.对于以下数据框:
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排名).
任何帮助将非常感激!
在 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)