2012-03-13 18 views
14

चौड़े से लंबे समय तक कई उपायों को पता है, मुझे पता है कि लंबे समय से लंबे समय से कई बार पूछा गया है लेकिन मैं यह नहीं समझ सकता कि निम्नलिखित प्रारूप को लंबे प्रारूप में कैसे चालू किया जाए। गोली मारो मैंने एसओ पर दो बार दोहराए गए उपायों के साथ व्यापक रूप से लंबे समय तक पूछा। मैं अपने डेटा को बदलने में असमर्थता से निराश हो रहा हूं।प्रत्येक बार

 id trt work.T1 play.T1 talk.T1 total.T1 work.T2 play.T2 talk.T2 total.T2 
1 x1.1 cnt 0.34434350 0.7841665 0.1079332 0.88803151 0.64836951 0.87954320 0.7233519 0.5630988 
2 x1.2 tr 0.06132255 0.8426960 0.3338658 0.04685878 0.23478670 0.19711687 0.5164015 0.7617968 
3 x1.3 tr 0.36897981 0.1834721 0.3241316 0.76904051 0.07629721 0.06945971 0.4118995 0.7452974 
4 x1.4 tr 0.40759356 0.5285396 0.5654258 0.23022542 0.92309504 0.15733957 0.4132653 0.7078273 
5 x1.5 cnt 0.91433676 0.7029476 0.2031782 0.31518412 0.14721669 0.33345678 0.7620444 0.9868082 
6 x1.6 tr 0.88870525 0.9132728 0.2197045 0.28266959 0.82239037 0.18006177 0.2591765 0.4516309 
7 x1.7 cnt 0.98373218 0.2591739 0.6331153 0.71319565 0.41351839 0.14648269 0.7631898 0.1182174 
8 x1.8 tr 0.47719528 0.7926248 0.3525205 0.86213792 0.61252061 0.29057544 0.9824048 0.2386353 
9 x1.9 tr 0.69350823 0.6144696 0.8568732 0.10632352 0.06812050 0.93606889 0.6701190 0.4705228 
10 x1.10 cnt 0.42574646 0.7006205 0.9507216 0.55032776 0.90413220 0.10246047 0.5899279 0.3523231 
इस में

:: मैं इस (चर क्रम आवश्यक नहीं है) कैसे बदल सकते हैं

 id trt time  work  play  talk  total 
1 x1.1 cnt 1 0.34434350 0.78416653 0.1079332 0.88803151 
2 x1.2 tr 1 0.06132255 0.84269599 0.3338658 0.04685878 
3 x1.3 tr 1 0.36897981 0.18347215 0.3241316 0.76904051 
4 x1.4 tr 1 0.40759356 0.52853960 0.5654258 0.23022542 
5 x1.5 cnt 1 0.91433676 0.70294755 0.2031782 0.31518412 
6 x1.6 tr 1 0.88870525 0.91327276 0.2197045 0.28266959 
7 x1.7 cnt 1 0.98373218 0.25917392 0.6331153 0.71319565 
8 x1.8 tr 1 0.47719528 0.79262477 0.3525205 0.86213792 
9 x1.9 tr 1 0.69350823 0.61446955 0.8568732 0.10632352 
10 x1.10 cnt 1 0.42574646 0.70062053 0.9507216 0.55032776 
11 x1.1 cnt 2 0.64836951 0.87954320 0.7233519 0.56309884 
12 x1.2 tr 2 0.23478670 0.19711687 0.5164015 0.76179680 
13 x1.3 tr 2 0.07629722 0.06945971 0.4118995 0.74529740 
14 x1.4 tr 2 0.92309504 0.15733957 0.4132653 0.70782726 
15 x1.5 cnt 2 0.14721669 0.33345678 0.7620444 0.98680824 
16 x1.6 tr 2 0.82239038 0.18006177 0.2591765 0.45163091 
17 x1.7 cnt 2 0.41351839 0.14648269 0.7631898 0.11821741 
18 x1.8 tr 2 0.61252061 0.29057544 0.9824048 0.23863532 
19 x1.9 tr 2 0.06812050 0.93606889 0.6701190 0.47052276 
20 x1.10 cnt 2 0.90413220 0.10246047 0.5899279 0.35232307 

डेटा सेट

id <- paste('x', "1.", 1:10, sep="") 
set.seed(10) 
DF <- data.frame(id, trt=sample(c('cnt', 'tr'), 10, T), work.T1=runif(10), 
    play.T1=runif(10), talk.T1=runif(10), total.T1=runif(10), 
    work.T2=runif(10), play.T2=runif(10), talk.T2=runif(10), 
    total.T2=runif(10)) 

अग्रिम धन्यवाद!

संपादित करें: जब मैं set.seed (निश्चित रूप से एक त्रुटि करता था) का उपयोग कर रहा था तो कुछ खराब हुआ। यदि आप set.seed(10) का उपयोग करते हैं तो उपरोक्त वास्तव में डेटा वह डेटा नहीं है जिसे आप प्राप्त करेंगे। मैं ऐतिहासिक सटीकता के लिए त्रुटि छोड़ रहा हूं और यह वास्तव में लोगों द्वारा दिए गए समाधानों को प्रभावित नहीं करता है।

+0

स्पष्ट प्रश्न, पुन: उत्पन्न उदाहरण। +1 –

उत्तर

8

यह बहुत करीब है और स्तंभों के नाम बदलने अपने skillset के भीतर होना चाहिए:

reshape(DF, 
     varying=c(work= c(3, 7), play= c(4,8), talk= c(5,9), total= c(6,10)), 
     direction="long") 

संपादित करें:

reshape(DF, varying=list(work= c(3, 7), play= c(4,8), talk= c(5,9), total= c(6,10)), 
     v.names=c("Work", "Play", "Talk", "Total"), 
      # that was needed after changed 'varying' arg to a list to allow 'times' 
     direction="long", 
     times=1:2,  # substitutes number for T1 and T2 
     timevar="times") # to name the time col 
+1

आपको बहुत बहुत धन्यवाद! मैं उसके करीब था लेकिन मुझे समझ में नहीं आया कि मैं क्या कर रहा था। बहुत आसान और मैंने बेस में reshape के बारे में कुछ और सीखा (शक्तिशाली लेकिन कभी-कभी भ्रमित करने वाला फ़ंक्शन। –

+0

मैं पूरी तरह से सहमत हूं कि यह भ्रमित हो सकता है। बेन बोल्कर की तरह, मैं बस reshape :: melt का उपयोग करता था। –

+0

बस यहां वापस आया (I इच्छा एसओ ने आपको बताया कि अगर कोई अपना जवाब संपादित करता है, तो सिर्फ एक सुझाव है कि जब आप ऐसा करते हैं तो आप कोई टिप्पणी जोड़ते हैं तो पोस्टर को सूचित करते हैं) और मुझे पहले आपका जवाब पसंद आया। मुझे वाकई यह पसंद है। एनोटेशन बहुत ही भयानक हैं। धन्यवाद! –

3
अजीब तरह पर्याप्त

मैं डॉन: एक संस्करण लगभग एक सटीक उपाय है कि जोड़ा जा रहा है आपको उतनी ही संख्याएं मिलती हैं (जो मुझे चाहिए क्योंकि हम दोनों set.seed(10) का उपयोग करते हैं?) लेकिन अन्यथा ऐसा लगता है कि यह चाल चलती है:

library(reshape) #this might work with reshape2 as well, I haven't tried ... 
DF2 <- melt(DF,id.vars=1:2) 
## split 'activity.time' label into two separate variables 
DF3 <- cbind(DF2, 
      colsplit(as.character(DF2$variable),"\\.", 
         names=c("activity","time"))) 
## rename time, reorder factors: 
DF4 <- transform(DF3, 
       time=as.numeric(gsub("^T","",time)), 
       activity=factor(activity, 
        levels=c("work","play","talk","total")), 
       id=factor(id,levels=paste("x1",1:10,sep="."))) 
## reshape back to wide 
DF5 <- cast(subset(DF4,select=-variable),id+trt+time~activity) 
## reorder 
DF6 <- with(DF5,DF5[order(time,id),]) 

यह @ डीविन के उत्तर से अधिक जटिल है लेकिन शायद (?) अधिक सामान्य है।

+0

धन्यवाद आप बेन। मैं आपकी प्रतिक्रिया और डीविन दोनों को (अब 200 से अधिक पृष्ठों) आर नोट्स जोड़ रहा हूं। दोनों प्रतिक्रियाएं स्थिति के आधार पर बहुत अंतर्दृष्टिपूर्ण थीं। +1 –

2

यदि आप वास्तव में आउटपुट में "समय" चर में "टी" नहीं चाहते थे, तो क्या आप बस निम्न कार्य नहीं कर पाए?

names(DF) = sub("T", "", names(DF)) 
reshape(DF, direction="long", varying=3:10) 

या names(DF) बदले बिना,, तो आप बस "टी" शामिल करने के लिए sep= तर्क सेट कर सकते हैं:

reshape(DF, direction="long", varying=3:10, sep=".T") 

मैं थोड़ा उलझन में हूँ, यद्यपि। जैसा कि बेन बोल्कर ने a in his comment की ओर इशारा किया था, आपका "डेटासेट कोड" आपके पास समान संख्या प्रदान नहीं करता है। इसके अलावा, डीडब्ल्यूइन और मेरा मिलान पूरी तरह से मेल खाता है, लेकिन यह आपके मूल प्रश्न में "इस" आउटपुट के साथ मेल नहीं खाता है।

मैंने अपने परिणामों के साथ "डीविन" नामक एक डेटा फ्रेम बनाकर और मेरे परिणामों के साथ "मेरा" नामक एक डेटा फ्रेम बनाकर और DWin == mine का उपयोग करके इसकी तुलना की।

क्या आप यह सत्यापित कर सकते हैं कि हमें जो उत्पादन मिला है वह वास्तव में आपको चाहिए?

+0

हां आउटपुट आप और डीविन मिल गया है। मेरे उपयोग के साथ समस्या set.seed। मैं क्षमा चाहता हूं। बहुत अच्छा कोड। बहुत कम कोड –

0

एक और तरीका है समस्या यह है कि बहुत कम कोड की आवश्यकता है लेकिन संभावना धीमी होगी दृष्टिकोण ,:

DF.1 <- DF[, 1:2] 
DF.2 <- DF[, 3:6] 
DF.3 <- DF[, 7:10] 

names(DF.2) <- names(DF.3) <- unlist(strsplit(names(DF.2), ".", fixed=T))[c(T,F)] 
time <- rep(1:2, each=nrow(DF.1)) 
data.frame(rbind(DF.1, DF.1), time, rbind(DF.2, DF.3)) 
4

सबसे संक्षिप्त तरीके tidyr dplyr पुस्तकालय के साथ संयुक्त उपयोग करने के लिए है।

library(tidyr) 
library(dplyr) 
result <- DF %>% 
    # transfer to 'long' format 
    gather(loc, value, work.T1:total.`enter code here`T2) %>% 
    # separate the column into location and time 
    separate(loc, into = c('loc', 'time'), '\\.') %>% 
    # transfer to 'short' format 
    spread(loc, value) %>% 
    mutate(time = as.numeric(substr(time, 2, 2))) %>% 
    arrange(time) 

tidyr विशेष रूप से डेटा साफ करने के लिए डिज़ाइन किया गया है।

+0

मैं अन्य समाधानों की तुलना में उस संक्षिप्त को कॉल नहीं करता। –

+1

यह समाधान से बेहतर है 'reshape' का उपयोग करें - इसकी कार्यात्मक शैली ('%>% 'ऑपरेटर) और अधिक प्रदर्शन करने के लिए धन्यवाद पढ़ने के लिए, मुझे लगता है कि, C++ में महत्वपूर्ण भाग लिखे जाने के कारण। – GregT

+1

'यहां कोड दर्ज करें' भाग क्या होना चाहिए? @ यिंग्स माओ – vashts85

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