2013-04-22 6 views
5

का उपयोग कर किसी सब्सक्रिप्शन पर संचालन करना मेरे पास विस्तृत रूप में एक सर्वेक्षण डेटा सेट है। किसी विशेष प्रश्न के लिए कच्चे आंकड़ों में चर के एक सेट को इस तथ्य का प्रतिनिधित्व करने के लिए बनाया गया था कि एक विशेष महीने में सर्वेक्षण प्रश्न पूछा गया था।डेटा तालिका

मैं उन चर के नए सेट बनाना चाहता हूं जिनमें महीने-परिवर्तनीय नाम हैं; इन चर के मूल्य को महीने के लिए एक महीने-भिन्न प्रश्न के मूल्य के अनुरूप होगा। वहाँ वास्तव में केवल दो सवाल कर रहे हैं इस सर्वेक्षण में

require(data.table) 

data <- data.table(month = rep(c('may', 'jun', 'jul'), each = 5), 
        may.q1 = rep(c('yes', 'no', 'yes'), each = 5), 
        jun.q1 = rep(c('breakfast', 'lunch', 'dinner'), each = 5), 
        jul.q1 = rep(c('oranges', 'apples', 'oranges'), each = 5), 
        may.q2 = rep(c('econ', 'math', 'science'), each = 5), 
        jun.q2 = rep(c('sunny', 'foggy', 'cloudy'), each = 5), 
        jul.q2 = rep(c('no rain', 'light mist', 'heavy rain'), each = 5)) 

,: "q1" और "Q2"

कृपया एक उदाहरण/काल्पनिक डेटा सेट को देखते हैं। इन सवालों में से प्रत्येक बार बार-बार पूछे जाते हैं। हालांकि, अवलोकन में केवल वैध प्रतिक्रिया होती है यदि डेटा में देखा गया महीना किसी विशेष महीने के लिए सर्वेक्षण प्रश्न के साथ मेल खाता है।

उदाहरण के लिए: "मई" में किसी भी अवलोकन के लिए "may.q1" को "हां" के रूप में देखा जाता है। मुझे "may.q1", "jun.q1", और "jul.q1" का प्रतिनिधित्व करने के लिए एक नया "क्यू 1" वैरिएबल चाहिए। "क्यू 1" का मान "मई" होने पर "may.q1" के मान पर होगा, और "क्यू 1" का मूल्य "जून 1" के मूल्य पर होगा जब माह "जून" होगा ।

अगर मैं कोशिश करते हैं और डेटा तालिका का उपयोग कर हाथ से यह करने के लिए थे, मैं की तरह कुछ चाहेगा:

mdata <- data[month == 'may', c('month', 'may.q1', 'may.q2'), with = F] 
setnames(mdata, names(mdata), gsub('may\\.', '', names(mdata))) 

मैं "= महीने से" इस दोहराया चाहते हैं। ,

require(plyr) 
data <- data.frame(data) 

mdata <- ddply(data, .(month), function(dfmo) { 
    dfmo <- dfmo[, c(1, grep(dfmo$month[1], names(dfmo)))] 
    names(dfmo) <- gsub(paste0(dfmo$month[1], '\\.'), '', names(dfmo)) 
    return(dfmo) 
}) 

एक data.table विधि का उपयोग कर किसी भी मदद की बहुत सराहना की जाएगी मेरी डेटा के रूप में:

अगर मैं एक डेटा फ्रेम के लिए "plyr" पैकेज का उपयोग करने के लिए गए थे, मैं निम्नलिखित दृष्टिकोण का उपयोग कर हल किया बड़े हैं धन्यवाद।

उत्तर

5

एक अलग तरीके से वर्णन करने के लिए:

data[, .SD[,paste0(month,c(".q1",".q2")), with=FALSE], by=month] 

    month may.q1  may.q2 
1: may  yes  econ 
2: may  yes  econ 
3: may  yes  econ 
4: may  yes  econ 
5: may  yes  econ 
6: jun lunch  foggy 
7: jun lunch  foggy 
8: jun lunch  foggy 
9: jun lunch  foggy 
10: jun lunch  foggy 
11: jul oranges heavy rain 
12: jul oranges heavy rain 
13: jul oranges heavy rain 
14: jul oranges heavy rain 
15: jul oranges heavy rain 

लेकिन स्तंभ नाम पहले समूह से आते हैं ध्यान दें (बाद में setnames का उपयोग कर नाम बदल सकते हैं)। और यदि यह केवल कुछ आवश्यक के साथ बड़ी संख्या में कॉलम हैं तो यह सबसे कुशल नहीं हो सकता है। उस मामले में अरुण का समाधान लंबे प्रारूप में पिघलने से तेज होना चाहिए।

+0

ओह वाह उपयोग कर सकते हैं .. मैं इस के बारे में सोच सहारे चाहते हैं! बहुत बढ़िया। – Arun

+0

मैथ्यूडॉउल, यह * निश्चित रूप से * (मेरी) पिघला + कास्ट से तेज है। मैंने इसे एक बड़े डेटा पर आज़माया। मेरा कोई नजदीक नहीं है ... 1e5 * 100 कॉलम पर 23 सेकंड लगते हैं जबकि यह एक सेकंड से भी कम समय में होता है! – Arun

3

संपादित करें: बड़े डेटा पर बहुत अक्षम है। के लिए वास्तव में तेज़ और साफ समाधान के लिए @ मैथ्यूडॉउल का उत्तर देखें।

यहां data.table का उपयोग कर एक समाधान है।

dd <- melt.dt(data, id.var=c("month"))[month == gsub("\\..*$", "", ind)][, 
     ind := gsub("^.*\\.", "", ind)][, split(values, ind), by=list(month)] 

समारोह melt.dt एक छोटे से समारोह (अभी भी और अधिक सुधार किया जा करने के लिए) मैं melt को पत्र लिखा है एक data.tableplyr (कॉपी में melt समारोह के समान/इस समारोह कोड आज़माने से पहले नीचे दिखाया गया पेस्ट ऊपर)।

melt.dt <- function(DT, id.var) { 
    stopifnot(inherits(DT, "data.table")) 
    measure.var <- setdiff(names(DT), id.var) 
    ind <- rep.int(measure.var, rep.int(nrow(DT), length(measure.var))) 
    m1 <- lapply(c("list", id.var), as.name) 
    m2 <- as.call(lapply(c("factor", "ind"), as.name)) 
    m3 <- as.call(lapply(c("c", measure.var), as.name))  
    quoted <- as.call(c(m1, ind = m2, values = m3)) 
    DT[, eval(quoted)] 
} 

विचार: पहले data.tableid.var = month साथ स्तंभ पिघला। अब, आपके सभी पिघला हुआ कॉलम नाम month.question रूप में हैं। तो, इस पिघला हुआ कॉलम से ".question" को हटाकर और month कॉलम के साथ समीकरण करके, हम सभी अनावश्यक प्रविष्टियों को हटा सकते हैं। एक बार ऐसा करने के बाद, हमें "महीने" की आवश्यकता नहीं है। अब पिघला हुआ कॉलम "इंड" में। इसलिए, हम "महीने" को हटाने के लिए gsub का उपयोग करते हैं। केवल q1, q2 आदि बनाए रखने के लिए .. इसके बाद, हमें reshape (या cast) होना चाहिए। यह month द्वारा समूहित करके values कॉलम को ind द्वारा विभाजित करके किया जाता है (जिसमें q1 या q2 है।तो, आपको वांछित आउटपुट प्राप्त करने के लिए हर महीने के लिए 2 कॉलम मिलेंगे (जो तब एक साथ सिलाई जाती है)।

1

कुछ इस तरह के बारे में क्या

data <- data.table(
        may.q1 = rep(c('yes', 'no', 'yes'), each = 5), 
        jun.q1 = rep(c('breakfast', 'lunch', 'dinner'), each = 5), 
        jul.q1 = rep(c('oranges', 'apples', 'oranges'), each = 5), 
        may.q2 = rep(c('econ', 'math', 'science'), each = 5), 
        jun.q2 = rep(c('sunny', 'foggy', 'cloudy'), each = 5), 
        jul.q2 = rep(c('no rain', 'light mist', 'heavy rain'), each = 5) 
        ) 


tmp <- reshape(data, direction = "long", varying = 1:6, sep = ".", timevar = "question") 

str(tmp) 
## Classes ‘data.table’ and 'data.frame': 30 obs. of 5 variables: 
## $ question: chr "q1" "q1" "q1" "q1" ... 
## $ may  : chr "yes" "yes" "yes" "yes" ... 
## $ jun  : chr "breakfast" "breakfast" "breakfast" "breakfast" ... 
## $ jul  : chr "oranges" "oranges" "oranges" "oranges" ... 
## $ id  : int 1 2 3 4 5 6 7 8 9 10 ... 

आप आगे जाने के लिए और इस डेटा पिघलने फिर आप पिघल पैकेज

require(reshape2) 
## remove the id column if you want (id is the last col so ncol(tmp)) 
res <- melt(tmp[,-ncol(tmp), with = FALSE], measure.vars = c("may", "jun", "jul"), value.name = "response", variable.name = "month") 

str(res) 
## 'data.frame': 90 obs. of 3 variables: 
## $ question: chr "q1" "q1" "q1" "q1" ... 
## $ month : Factor w/ 3 levels "may","jun","jul": 1 1 1 1 1 1 1 1 1 1 ... 
## $ response: chr "yes" "yes" "yes" "yes" ... 
संबंधित मुद्दे