2016-10-12 11 views
6

これは私のデータの再現可能な例です。次のデータフレームの場合:他の列のランクに基づいてRのデータフレームに列を追加する

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

私はそれは次のようになりますように、件名による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"))) 

しかし、私は、次のGET:

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までのランク付け)。

ご協力いただければ幸いです。

少し汚れ
+4

'dplyr :: dense_rank'を試してください。または、パッケージを使用したくない場合は、そのコードを使用してください。基本Rコードの2行だけです。 –

+2

'function(x)as.numeric(factor(x))'があなたの試みで動作します。とにかく「SNR」のタイプに戻ってくれるので、「factor(x)」と表示されます。 – rawr

+0

@rawrありがとう、そのトリックはありました。 – Rmg

答えて

2

に言及するために:

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 
1

動作するようです:

単位時間の
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 
+0

Downvote、これは間違っていますか? – Haboryme

+0

私の投票ではありませんが、実際には列を追加するためにパッケージを読み込む必要がないためです。 –

+0

定期的に使用しない場合は、dplyrをロードする必要があります。私はas.numeric(as.factor())のためにダウン投票を考えていますが、まだそれは少し賢明です – infominer

1
library(dplyr)  
df %>% 
    arrange(Subject, SNR) %>% 
    group_by(Subject) %>% 
    mutate(rank=dense_rank(SNR)) 

リッチスクリヴン@にベースRでaggregatefactorを使用してdense_rank()

2

別のベース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),]で最初にそれを注文する必要があります。

関連する問題