आर

2013-02-09 11 views
5

में पंक्तियों में एक समूहीकृत सतत चर परिवर्तित मैं इन मूल्यों डमी vales के साथ एक डेटा फ्रेम है और मैं उन पर एलएम प्रतिगमन करना चाहते हैं। चर से एक एक वर्गीकृत किया निरंतर चर के रूप में नीचेआर

df <- data.frame("y" = c(10, 11, 12, 13, 14), 
       "x" = as.factor(c("100-102", "103-105", "106-108", "109-111", "112-114"))) 

से पता चला मैं y वापसी करने के लिए ~ x चाहते है, एक तरह से उनके माध्य संख्यात्मक मान के साथ एक्स कारकों को बदलने के लिए है। यह नियमित अभिव्यक्ति का उपयोग करके आसानी से किया जाता है।

एक और तरीका है अतिरिक्त पंक्तियों बना सकते हैं और आपके डेटासेट का विस्तार तो यह इस

data.frame("y" = c(10, 10, 10, 11, 11, 11......), 
      "x" = c(100, 101, 102, 103, 104, 105......)) 

तरह लग रहा है कि वहाँ एक समारोह है कि यह कर देगा है के लिए है?

मैं पहली बार x1, x2, x3 की तरह अतिरिक्त चर बनाने की सोच रहा हूँ और फिर पैकेज reshape2 का उपयोग करने के लिए पंक्तियों एक्स कॉलम कन्वर्ट करने के लिए।

उत्तर

4

एक data.table समाधान। यह बड़े data.frame पर भी वास्तव में तेज़ होना चाहिए।

require(data.table) 
dt <- data.table(df, key="y") 
dt[, list(x=seq(sub("-.*$", "", x), sub(".*-", "", x))),by=y] 

आप अधिक स्तंभ है और आप प्रत्येक संयोजन नहीं करना चाहती है, जबकि स्तंभ x द्वारा बंटवारे, तो यह उपयोग करने के लिए कोड है:

require(data.table) 
dt <- data.table(df) 
# get all column names except "x" 
key.cols <- setdiff(names(df), "x") 
# set the data.table columns to key.cols 
setkeyv(dt, key.cols) 
dt.out <- dt[, list(x=seq(sub("-.*$", "", x), sub(".*-", "", x))), by = key.cols] 

यह आपको देना चाहिए कि तुम क्या उम्मीद करते हैं।

+0

यह एक सुरुचिपूर्ण और सरल समाधान है। धन्यवाद। बीटीडब्ल्यू यह एकाधिक कॉलम वाले डेटासेट के साथ कैसे स्केल करेगा। मेरा उदाहरण एक डमी डेटाफ्रेम था। मेरे वास्तविक dataframe विभाजित करने के लिए सांख्यिक स्तंभ और एक कारक स्तंभ – MySchizoBuddy

+0

को केवल एक कॉलम के बहुत सारे है, लेकिन इतना सभी स्तंभों के लिए पंक्तियों y – MySchizoBuddy

+1

कोड के बहुत कम लाइनों के साथ अच्छा काम करता है के साथ साथ ही दोहराया जाना चाहिए डाटासेट, कई कॉलम शामिल हैं। धन्यवाद – MySchizoBuddy

2
require(stringr) 
require(foreach) 

foreach(i=1:nrow(df), .combine=rbind) %do% { 
    s <- as.numeric(str_extract_all(df$x[i], "[0-9]+")[[1]]) 
    data.frame(y=rep(df$y[i], s[2]-s[1]+1), x=seq(s[1], s[2])) 
} 

यदि आपका data.frame वास्तव में बड़ी आप %dopar% के साथ जा सकते हैं।

+0

त्वरित था। सिर्फ 2500 पंक्तियों में बड़ी नहीं है। – MySchizoBuddy

+0

'%%' और '% dopar%' 'foreach' पैकेज द्वारा प्रदान की जाती है। – redmode