2010-07-07 10 views
7

मैं जनसंख्या और तिथि के अनुसार इस dataframe ऑर्डर करने के लिए कोशिश कर रहा हूँ, इसलिए मैं order() और rank() कार्यों का उपयोग कर रहा:मैं रैंक() फ़ंक्शन के साथ एक नया ties.method कैसे बना सकता हूं?

> df <- data.frame(idgeoville = c(5, 8, 4, 3, 4, 5, 8, 8), 
        date  = c(rep(1950, 4), rep(2000, 4)), 
        population = c(500, 450, 350, 350, 650, 500, 500, 450)) 
> df 
    idgeoville date population 
1 5   1950  500 
2 8   1950  450 
3 4   1950  350 
4 3   1950  350 
5 4   2000  650 
6 5   2000  500 
7 8   2000  500 
8 8   2000  450 
ties.method = "first" मैं कोई समस्या नहीं है के साथ

, अंत में मैं इस dataframe उत्पादन कर रहा हूँ:

idgeoville date population rank 
1 5   1950  500  1 
2 8   1950  450  2 
3 4   1950  350  3 
4 3   1950  350  4 
5 4   2000  650  1 
6 5   2000  500  2 
7 8   2000  500  3 
8 8   2000  450  4 

लेकिन वास्तव में, मैं बराबर जनसंख्या रैंक के लिए बराबर रैंकिंग इस तरह के साथ एक dataframe हैं:

idgeoville date population rank 
1 5   1950  500  1 
2 8   1950  450  2 
3 4   1950  350  3 
4 3   1950  350  3 
5 4   2000  650  1 
6 5   2000  500  2 
7 8   2000  500  2 
8 8   2000  450  3 

मैं इस समस्या को आर के साथ कैसे हल कर सकता हूं? एक कस्टम ties.method() या अन्य आर चाल के साथ?

+0

क्या संबंधों के बारे में = मिनट, या अधिकतम, या औसत ... वे सभी रैंकों रखने एक ही मूल्य से संबंध है। – John

+0

न्यूनतम और x2 <- c (1,1,2,3) के साथ, मेरे पास 1 1 3 4/ अधिकतम और x2 <- c (1,1,2,3) के साथ, मेरे पास 2 2 3 4 है मैं x2 रैंक => 1 1 2 3 – reyman64

+0

के लिए यह परिणाम चाहता हूं या, 'अधिकतम' का उपयोग करें और परिणाम से संबंधों की संख्या घटाएं? '2 2 3 4-1 = 1 1 2 3'। अब, समस्या संबंधों की संख्या को समझना है ... वैसे भी, मैं बस Google के माध्यम से इस धागे में हुआ। – Frank

उत्तर

4

मेरा मानना ​​है कि रैंक के साथ ऐसा करने का कोई विकल्प नहीं है; यहाँ है कि तुम क्या चाहते हो जाएगा एक कस्टम समारोह है, लेकिन यह तो आपको अपने डेटा बहुत बड़ा है बहुत धीमी गति से हो सकता है:

Rank<-function(d) { 
    j<-unique(rev(sort(d))); 
    return(sapply(d,function(dd) which(dd==j))); 
} 
+0

बहुत कुछ, यह ठीक है! लेकिन अगर किसी अन्य व्यक्ति के पास आर पैकेज के साथ बेहतर और/या तेज समाधान है, तो मैं लेता हूं! – reyman64

1

यह एक अलग सवाल है, अर्थात् है कि कैसे एक data.frame वस्तु एकाधिक स्तंभों के आधार पर सॉर्ट करने के लिए जवाब।

> library(reshape) 
> sort_df(df,vars=c('date','population')) 
    idgeoville date population 
3   4 1950  350 
4   3 1950  350 
2   8 1950  450 
1   5 1950  500 
8   8 2000  450 
6   5 2000  500 
7   8 2000  500 
5   4 2000  650 
+0

यह सवाल का जवाब नहीं देता है। इसके अलावा, रैंकिंग के लिए 'आबादी' को आरोही क्रम में क्रमबद्ध किया गया है, मैं अवरोही क्रम (सबसे बड़ा पहले) की अपेक्षा करता हूं। – Uwe

6

अधिक आसान तरीका: ऐसा करने के लिए, आप पैकेज reshape में समारोह sort_df इस्तेमाल कर सकते हैं

pop.rank <- as.numeric(factor(population)) 
+0

यह केवल 'आबादी' का उपयोग करता है और ओपी द्वारा अनुरोध किया गया था 'तारीख' को अनदेखा करता है। इसलिए, यह एक समग्र रैंक बनाएगा लेकिन प्रत्येक 'तारीख' के लिए अलग रैंकिंग नहीं होगा। – Uwe