2016-10-12 14 views
6

के रैंक के आधार पर आर में डेटा फ्रेम में एक कॉलम जोड़ना मेरे डेटा का एक पुन: प्रस्तुत उदाहरण है। निम्न डेटा फ्रेम के लिए:किसी अन्य कॉलम

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)) 

मैं एक स्तंभ 'पद' है कि, विषय से SNR के लिए एक रैंकिंग प्रदान करता है इतना है कि यह इस प्रकार दिखाई देगा जोड़ना चाहते हैं का उपयोग करते हुए:

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 से रैंकिंग)।

किसी भी मदद की बहुत सराहना की जाएगी!

+4

'dplyr :: dense_rank' के साथ प्रयास करें। या यदि आप पैकेज का उपयोग नहीं करना चाहते हैं तो बस इसके कोड का उपयोग करें; यह बेस आर कोड की केवल दो पंक्तियां हैं। –

+2

'फ़ंक्शन (x) as.numeric (कारक (x)) 'आपके प्रयास में काम करेगा। या सिर्फ 'कारक (एक्स)' के बाद से 'एसएनआर' के प्रकार को वापस भेज देगा, वैसे भी – rawr

+0

धन्यवाद @rawr, यह चाल है। – Rmg

उत्तर

2

उल्लेख आधार आर में aggregate और 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 
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

डाउनवोट, क्या यह गलत है? – Haboryme

+0

मेरा वोट नहीं, लेकिन मैं इसका अनुमान लगा रहा हूं क्योंकि आपको कॉलम जोड़ने के लिए वास्तव में पैकेज लोड करने की आवश्यकता नहीं है। –

+0

यदि आप इसे नियमित रूप से उपयोग नहीं करते हैं तो आपको dplyr लोड करना होगा, मुझे लगता है कि नीचे वोट (मेरे द्वारा नहीं) के रूप में। संख्यात्मक (as.factor()) के कारण था .. लेकिन फिर भी यह थोड़ा सा pedantic है – infominer

1
library(dplyr)  
df %>% 
    arrange(Subject, SNR) %>% 
    group_by(Subject) %>% 
    mutate(rank=dense_rank(SNR)) 
पाठ्यक्रम क्रेडिट की

@ अमीर Scriven को dense_rank()

2

एक और आधार आर विधि:

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 

अपने dataframe अभी तक आदेश नहीं दिया गया है, तो आप यह पहली df1 <- df1[order(df1$SNR),] साथ इस विधि के लिए सही परिणाम देने के लिए आदेश देना चाहिए।

संबंधित मुद्दे