2015-07-29 3 views
7

मैंने एक अध्ययन किया कि, पीछे की ओर (एक जीवन, एक सीखता है :-)) बहुस्तरीय डेटा उत्पन्न करता प्रतीत होता है। अब मैं डेटासेट को व्यापक से लंबे समय तक पुन: स्थापित करने की कोशिश कर रहा हूं ताकि मैं इसका उपयोग करके इसका विश्लेषण कर सकूं। lme4।मैं 'चौगुनी घोंसले' के साथ एक बहुस्तरीय संरचना के लिए एक विस्तृत डेटा फ्रेम को एक लंबे डेटाफ्रेम में कैसे परिवर्तित करूं?

ऐसा करने में, मुझे एक, उम, चुनौती का सामना करना पड़ता है, कि मैंने कुछ बार पहले भाग लिया है, लेकिन जिसके लिए मुझे कभी भी अच्छा समाधान नहीं मिला है। मैंने इस बार फिर से खोज की है, लेकिन शायद मैं गलत कीवर्ड का उपयोग करता हूं - या यह समस्या मैंने सोचा जितना दुर्लभ है।

असल में, इस डेटासेट में, variablenames इंगित करता है कि कौन सा उपाय डेटा एकत्र किया जाता है। मैंने प्रतिभागियों को ग्रेड (दर) हस्तक्षेप के लिए कहा (वास्तव में कुछ भी हो सकता है)। प्रत्येक हस्तक्षेप 6 व्यवहार डोमेन में से एक में है। इसके अलावा, प्रतिभागियों ने प्रत्येक हस्तक्षेप को या तो खुद को प्रस्तुत किया, या साथ ही साथ एक दूसरे हस्तक्षेप के साथ, या दो अन्य हस्तक्षेपों के साथ मूल्यांकन किया। तीन प्रकार के हस्तक्षेप थे, और वे सभी (टी 0) से पहले रेट किए गए थे और बाद में (टी 1) मैंने उन्हें कुछ जानकारी प्रदान की थी।

तो, प्रभाव में, मैं एक dataframe है कि इस तरह से पुनर्जीवित किया जा सकता है:

### Elements of the variable names 
measurementMomentsVector <- c("t0", "t1"); 
interventionTypesVector <- c("fear", "know", "scd"); 
nrOfInterventionsSimultaneouslyVector <- c(1, 2, 3); 
behaviorDomainsVector <- c("diet", "pox", "alc", "smoking", "traff", "adh"); 

### Generate a vector with all variable names 
variableNames <- 
    apply(expand.grid(measurementMomentsVector, 
        interventionTypesVector, 
        nrOfInterventionsSimultaneouslyVector, 
        behaviorDomainsVector), 
     1, paste0, collapse="_"); 

### Generate 5 'participants' worth of data 
wideData <- data.frame(matrix(rnorm(5*length(variableNames)), nrow=5)); 

### Assign names 
names(wideData) <- variableNames; 

### Add unique id variable for every participants 
wideData$id <- 1:5; 

तो head(wideData)[, 1:5] का उपयोग कर आप मोटे तौर पर क्या dataframe लग रहा है देख सकते हैं जैसे:

t0_fear_1_diet t1_fear_1_diet t0_know_1_diet t1_know_1_diet t0_scd_1_diet 
1  -0.9338191  0.9747453  1.0069036  0.3500103 -0.844699708 
2  0.8921867  1.3687834  -1.2005791  0.2747955 1.316768219 
3  1.6200200  0.5245470  -1.2910586  1.3211912 -0.174795144 
4  0.1543738  0.7535642  0.4726131  -0.3464789 -0.009190702 
5  -1.3676692  -0.4491574  -2.0902003  -0.3484678 -2.537501824 

अब, मैं इस डेटा को 6 चर के साथ एक लंबे डेटाफ्रेम में कनवर्ट करना चाहते हैं, उदाहरण के लिए 'आईडी', 'मापनमेंट मॉमेंट', 'हस्तक्षेप टाइप', 'एनआरओएफ इंटरवेंशन' साथ-साथ ',' व्यवहारडोमेन 'और' मूल्यांकन ', जहां पहला चर प्रतिभागियों को दर्शाता है एक रिकॉर्ड संबंधित है, लास टी परिवर्तनीय स्कोर (रेटिंग, ग्रेड, मूल्यांकन) प्रतिभागियों ने एक विशिष्ट हस्तक्षेप दिया है, और बीच में चार चर बताते हैं कि कौन सा हस्तक्षेप बिल्कुल मूल्यांकन किया जा रहा है।

मैं शायद इस समस्या के लिए कुछ 'कस्टम' कोड लिख सकता हूं, लेकिन मुझे उम्मीद है कि आर के पास इसके लिए कुछ है। मैं reshape2 के साथ प्रयोग करना किया गया है, जैसे:

longData <- reshape(wideData, varying=1:(ncol(wideData)-1), 
        idvar="id", 
        sep="_", direction="long") 

लेकिन यह समय-अलग चर का अनुमान लगाना प्रबंधित नहीं करता है:

Error in guess(varying) : 
    failed to guess time-varying variables from their names 

मैं अब इस में कुछ समय के साथ संघर्ष कर रहा है, और मैं ऑनलाइन कोई जवाब खोजने का प्रबंधन नहीं करता हूं। और अब मुझे वास्तव में आगे बढ़ने की जरूरत है, इसलिए मैंने सोचा कि मैं इसे कस्टम-निर्मित लिखने का प्रयास करने से पहले आखिरी प्रयास के रूप में कोशिश करूंगा :-)

मैं किसी भी पॉइंटर्स को किसी भी पॉइंटर्स की सराहना करता हूं !!!

+0

'firstSecondOccurrenceVector' का मूल्य क्या है? – krlmlr

+0

क्षमा करें, इससे पहले कि मैंने इसे थोड़ा सा स्पष्ट किया था, वह बाएं ओवर था! यह अब महत्वपूर्ण नहीं है :-) भ्रम के लिए खेद है! – Matherion

+0

माफी माँग मत करो। इसके बजाय कोड संपादित करें ताकि यह चलता है। –

उत्तर

8

मैं आपकी समस्या एक दो चरणों दृष्टिकोण के साथ हल किया जा सकता लगता है:

  1. में अपने डेटा को पिघला एक लंबे data.frame (या मैंने किया था के रूप में, में एक लंबा data.table)
  2. सभी के साथ variable स्तंभ विभाजित लेबल प्रत्येक आवश्यक समूहिंग चर के लिए अलग कॉलम में।

के रूप में इस के लिए जानकारी लेबल में है, यह आसानी से data.table पैकेज से tstrsplit समारोह के साथ प्राप्त किया जा सकता है।

library(data.table) 
longData <- melt(setDT(wideData), id.vars="id") 
longData[, c("moment", "intervention", "number", "behavior") := 
       tstrsplit(variable, "_", type.convert = TRUE) 
     ][, variable:=NULL] 

परिणाम:

यह आप के लिए क्या देख जा सकता है

> head(longData,15) 
    id  value moment intervention number behavior 
1: 1 -0.07747254  t0   fear  1  diet 
2: 2 -0.76207379  t0   fear  1  diet 
3: 3 1.15501244  t0   fear  1  diet 
4: 4 1.24792369  t0   fear  1  diet 
5: 5 -0.28226121  t0   fear  1  diet 
6: 1 -1.04875354  t1   fear  1  diet 
7: 2 -0.91436882  t1   fear  1  diet 
8: 3 0.72863487  t1   fear  1  diet 
9: 4 0.10934261  t1   fear  1  diet 
10: 5 -0.06093002  t1   fear  1  diet 
11: 1 -0.70725760  t0   know  1  diet 
12: 2 1.06309003  t0   know  1  diet 
13: 3 0.89501164  t0   know  1  diet 
14: 4 1.48148316  t0   know  1  diet 
15: 5 0.22086835  t0   know  1  diet 

data.table के लिए एक विकल्प के रूप में, आप भी cSplit समारोह के साथ variable स्तंभ विभाजित कर सकते हैं splitstackshape पैकेज (हालांकि बाद में परिणामी चर कॉलम का नाम बदलना होगा):

library(splitstackshape) 
longData <- cSplit(longData, sep="_", "variable", "wide", type.convert=TRUE) 
names(longData) <- c("id","value","moment","intervention","number","behavior") 

या tidyr साथ:

library(tidyr) 
separate(longData, variable, c("moment", "intervention", "number", "behavior"), sep="_", remove=TRUE) 
+0

यह बहुत अच्छा है, धन्यवाद! वास्तव में मुझे क्या चाहिए। मुझे डेटा.table की ओर इशारा करने के लिए भी धन्यवाद, यह बहुत अच्छा लग रहा है! आपका बहुत बहुत धन्यवाद!!! – Matherion

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