2016-10-12 26 views
6

Verilerim için tekrarlanabilir bir örnek. Aşağıdaki veriler çerçevesi için: denedimR sütununda bir veri çerçevesine başka bir sütunun rütbesine dayalı bir sütun ekleme

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 

:

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

Ben bir sütun böyle olmazdı böylece Konuya Göre SNR için bir sıralama sağlamaktadır 'rütbe' eklemek istiyorum kullanarak:

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

Ama olsun şu:

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 

Ayrıca farklı ties.method seçeneklerini kullanmayı denedim, ancak hiçbiri bana aradığım şeyi vermiyor (yani, yalnızca 1-3 arasında bir sıralama).

Herhangi bir yardım çok takdir edilecektir!

+4

'dplyr :: dense_rank' ile deneyin. Ya da bir paket kullanmak istemiyorsanız sadece kodunu kullanın; Bu sadece iki satır R kodu. –

+2

'işlevi (x) as.numeric (factor (x))' girişimi çalışır. ya da sadece '' faktörü (x) '' ave zaten neyse 'SNR' türüne geri zorlayacaktır. – rawr

+0

Teşekkür ederim @rawr, bu hile yaptı. – Rmg

cevap

2

söz için:

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

Kirli bit ama iş gibi görünüyor: Tabii kredi

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, bu yanlış mı? – Haboryme

+0

Oy vermeme rağmen, sanırım bir sütun eklemek için bir paket yüklemeniz gerekmediğinden dolayı tahmin ediyorum. –

+0

Eğer düzenli olarak kullanmadıysanız dplyr yüklemek zorunda, ben aşağı oy (değil bana göre) as.numeric (as.factor()) nedeniyle oldu .. ama yine de bu biraz pedantic – infominer

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

@ zengin SCRIVEN taban Ar aggregate ve factor kullanma dense_rank()

2

Başka bir temel R yöntemi:

transform(df1, Rank = ave(SNR, Subject, FUN = function(x) cumsum(c(TRUE, head(x, -1) != tail(x, -1))))) 

verir: sizin dataframe henüz sipariş değilse

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 

, doğru bir sonuç vermek için bu yöntem için ilk df1 <- df1[order(df1$SNR),] ile sipariş edilmelidir.

İlgili konular