2010-10-22 11 views
8

मैं क्वांटाइल का प्रतिनिधित्व करने वाले कारकों को असाइन करना चाहता हूं। इस प्रकार मुझे उन्हें संख्यात्मक होने की आवश्यकता है।क्या आर में मात्रात्मक "डमी"/कारक बनाने का कोई बेहतर तरीका है?

qdum <- function(v,q){ 

qd = quantile(v,1:(q)/q) 
v = as.data.frame(v) 
v$b = 0 
names(v) <- c("a","b") 
i=1 
for (i in 1:q){ 

    if(i == 1) 
     v$b[ v$a < qd[1]] = 1 
    else 
     v$b[v$a > qd[i-1] & v$a <= qd[i]] = i 
} 

all = list(qd,v) 
return(all) 

    } 

अब आप हंसी सकता है :): यही कारण है कि मैं निम्नलिखित समारोह है, जो मूल रूप से मेरी समस्या का जवाब है लिखा था। लौटाई गई सूची में एक चर होता है जिसका उपयोग प्रत्येक अवलोकन को इसके संबंधित मात्रा में असाइन करने के लिए किया जा सकता है। मेरा सवाल अब है: क्या ऐसा करने के लिए एक बेहतर तरीका (अधिक "मूल" या "कोर") है? मुझे क्वांटकट (gtools पैकेज से) के बारे में पता है, लेकिन कम से कम मुझे प्राप्त पैरामीटर के साथ, मैं केवल उन unhandy (? - कम से कम मेरे लिए) सीमा के साथ समाप्त हो गया।

कोई प्रतिक्रिया जो बेहतर होने में मदद करती है उसकी सराहना की जाती है!

उत्तर

13
आधार आर के साथ

, उपयोग quantiles करना होगा विभाजन यह पता लगाने की और उसके बाद असतत को सांख्यिक चर कन्वर्ट करने के लिए कटौती:

qcut <- function(x, n) { 
    cut(x, quantile(x, seq(0, 1, length = n + 1)), labels = seq_len(n), 
    include.lowest = TRUE) 
} 

या यदि आप बस संख्या चाहते हैं:

qcut2 <- function(x, n) { 
    findInterval(x, quantile(x, seq(0, 1, length = n + 1)), all.inside = T) 
} 
+0

ऐसा लगता है कि हैडली प्रति स्वीकृत उत्तर अनुपात में अपने कीस्ट्रोक पर सुधार करने की कोशिश कर रहा है ... –

3

मुझे यकीन है कि क्या quantcut है नहीं कर रहा हूँ, लेकिन मैं निम्नलिखित

qdum <- function(v, q) { 
library(Hmisc) 
quantilenum <- cut2(v, g=q) 
levels(quantilenum) <- 1:q 
cbind(v, quantilenum) 
} 
+0

अच्छा जवाब। मूल रूप से क्वांटकट क्वांटकट के समान ही करता है। अंतर बनाने में मदद 1: क्यू के स्तर को प्रतिस्थापित करना था। मुझे नहीं पता था कि यह संभव था। थक्स समीर! –

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