簡體   English   中英

根據另一列的排名將列添加到R中的數據框

[英]adding a column to a data frame in R based on the rank of another column

這是我的數據的可重現的例子。 對於以下數據框:

df <- data.frame(Subject = c('John', 'John', 'John', 'John','Mary', 'Mary', 'Mary', 'Mary'),
                 SNR = c(-4,-4,0,4,0,4,4,8))

我想添加一個列'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

我嘗試過使用:

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

但我得到以下內容:

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   

我也試過使用不同的ties.method選項,但沒有一個給我我想要的東西(即,僅從1-3排名)。

任何幫助將非常感激!

在基數R中使用aggregatefactor

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

另一種基礎R方法:

transform(df1, Rank = ave(SNR, Subject, FUN = function(x) cumsum(c(TRUE, head(x, -1) != tail(x, -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

如果您的數據框尚未訂購,則應首先使用df1 <- df1[order(df1$SNR),]為此方法df1 <- df1[order(df1$SNR),]以提供正確的結果。

有點臟,但似乎工作:

library(dplyr)
df %>% group_by(Subject) %>% mutate(Rank = as.numeric(as.factor(SNR))) 

  Subject   SNR  Rank
   <fctr> <dbl> <dbl>
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
library(dplyr)    
df %>%
     arrange(Subject, SNR) %>%
     group_by(Subject) %>%
     mutate(rank=dense_rank(SNR))

當然要歸功於@ rich-scriven提及dense_rank()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM