R [बंद] में प्रतिशतक रैंक की गणना


18

मैं नए फ़्रेम को डेटा फ़्रेम में कैसे जोड़ सकता हूं जो कि किसी एक चर का प्रतिशत रैंक होगा? मैं एक्सेल में यह आसानी से कर सकता हूं, लेकिन मैं वास्तव में आर में ऐसा करना चाहता हूं।

धन्यवाद

जवाबों:


27

कच्चे डेटा मानों के एक वेक्टर को देखते हुए, एक साधारण फ़ंक्शन दिख सकता है

perc.rank <- function(x, xo)  length(x[x <= xo])/length(x)*100

x0वह मान कहां है जिसके लिए हम आर-ब्लॉगर्सx पर सुझाए गए वेक्टर को देखते हुए पर्सेंटाइल रैंक चाहते हैं ।

हालाँकि, इसे आसानी से वेक्टर किया जा सकता है

perc.rank <- function(x) trunc(rank(x))/length(x)

जिसका लाभ प्रत्येक मूल्य को पास न करने का है। तो, यहाँ उपयोग का एक उदाहरण है:

my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))

3
1. आपका कार्य एक्सेल की percentrankकमी की नकल नहीं करता है , जो कि अच्छा है (+1) क्योंकि बाद वाला "अजीब" परिणाम देता है (अपनी तुलना देखें )। 2. मैं डेटा फ्रेम का नाम नहीं दूंगा df, क्योंकि dfएक आर फ़ंक्शन (एफ वितरण का घनत्व, देखें ?df) है।
बेरंड वीस

1
@Bernd धन्यवाद (1) विभिन्न मनोचिकित्सा पैकेजों में पीआर कंप्यूटिंग के लिए कुछ अंतर्निहित कार्य हैं। मुझे लगता है कि मैंने CTTकुछ समय पहले पैकेज से इसे पकड़ा था। मैंने एक्सेल के खिलाफ जांच नहीं की क्योंकि मेरे पास इसका उपयोग / उपयोग नहीं है। के बारे में (2) मैं हमेशा इस बारे में भूल जाते हैं! आइए साथ my.*(पर्ल रास्ता) :-)
chl

@chl क्यों truncआवश्यक है? ऐसा लगता है कि रैंक हमेशा किसी भी तरह एक पूर्णांक लौटाएगा।
टायलर रिंकर

1
@ टायलर नोप। मामले rank()में, बंधे हुए मूल्यों के औसत लेने के लिए चूक हैं (सीएफ ties.method = c("average",...))।
CHL

8

यदि आपका मूल डेटा.फ्रेम कहा जाता है dfrऔर ब्याज का चर कहा जाता है myvar, तो आप dfr$myrank<-rank(dfr$myvar)सामान्य रैंक के dfr$myrank<-rank(dfr$myvar)/length(myvar)लिए या प्रतिशत रैंक के लिए उपयोग कर सकते हैं ।

ओह अच्छा। यदि आप वास्तव में इसे एक्सेल तरीका चाहते हैं (सबसे सरल समाधान नहीं हो सकता है, लेकिन मुझे नए (मेरे लिए) कार्यों का उपयोग करने और लूप से बचने में कुछ मज़ा आया है:

percentilerank<-function(x){
  rx<-rle(sort(x))
  smaller<-cumsum(c(0, rx$lengths))[seq(length(rx$lengths))]
  larger<-rev(cumsum(c(0, rev(rx$lengths))))[-1]
  rxpr<-smaller/(smaller+larger)
  rxpr[match(x, rx$values)]
}

तो अब आप उपयोग कर सकते हैं dfr$myrank<-percentilerank(dfr$myvar)

HTH।


1 - (रैंक / आकार) आपको एक्सेल
सेंटिलरैंक के

मुझे यह office.microsoft.com
निक

एक अनाम (प्रयास) संपादक ने निम्नलिखित टिप्पणी को जोड़ने की कोशिश की: "अच्छा कार्य लेकिन कभी-कभी, दुर्भाग्य से, RLE वेक्टर की वापसी कर सकता है length < length(dfr$myvar)"।
गूँग - मोनिका

1

प्रस्तुत उत्तर के साथ एक समस्या यह है कि यह ठीक से काम नहीं करेगा, जब आपके पास एनए होगा।

इस मामले में, एक और संभावना (chl function से कार्य से प्रेरित) है:

perc.rank <- function(x) trunc(rank(x,na.last = NA))/sum(!is.na(x))
quant <- function (x, p.ile) {
      x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}

यहाँ, x मानों का सदिश है, और p.ile रैंक द्वारा प्रतिशतक है। (मनमाने ढंग से) coef.mat के रैंक से 2.5 प्रतिशत की गणना निम्न द्वारा की जा सकती है:

quant(coef.mat[,3], 2.5)  
[1] 0.00025  

या एकल फ़ंक्शन के रूप में:

quant <- function (x, p.ile) {
   perc.rank <- trunc(rank(x,na.last = NA))/sum(!is.na(x))
   x = na.omit(x)
   x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.