2012-10-10 9 views
8

मेरे पास एक साधारण रीशेपिंग समस्या होनी चाहिए, लेकिन मैं इसे समझ नहीं सकता। अपने डेटा का एक हिस्सा इस तरह दिखता है:डुप्लिकेट के साथ डेटा फ्रेम को दोबारा बदलना

foo <- structure(list(grade = c(3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 
3, 3, 4, 4, 5, 5, 6, 6), var.type = structure(c(3L, 2L, 3L, 2L, 
3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L 
), .Label = c("Raw Score", "SE", "SS"), class = "factor"), var.val = c(120L, 
47L, 120L, 46L, 120L, 46L, 120L, 47L, 120L, 46L, 120L, 46L, 120L, 
12L, 120L, 14L, 120L, 16L, 120L, 20L)), .Names = c("grade", "var.type", 
"var.val"), row.names = c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
11L, 12L, 13L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L), class = "data.frame") 

या

grade var.type var.val 
2  3  SS  120 
3  3  SE  47 
4  4  SS  120 
5  4  SE  46 
6  5  SS  120 
7  5  SE  46 

मैं इसे इस तरह देखो बनाना चाहते:

grade SS SE 
3  120 47 
4  120 46 
5  120 46 

और इतने पर। मैं इस सूत्र में के रूप में आकृति बदलें, कलाकारों, और dcast की कोशिश की है:

Reshaping dataset

लेकिन कुछ भी काम करने के लिए लगता है। थोड़ी सहायता वास्तव में प्रशंसनीय होगी। TIA।

+2

उदाहरण डेटा आप हमारे ऊपर दिया है में, के साथ ('grade' एक पंक्ति है, 'var.type',' var.val') = (3, एसई, 47), साथ ही साथ एक (3, एसई, 12)। आउटपुट 'एसई' कॉलम में आप कौन सा 'var.val' दिखाना चाहते हैं? –

+0

ओह, क्षमा करें। मैं गड़बड़ कर दिया। ऐसा लगता है कि एक और चर है जिसे मुझे जोड़ने की ज़रूरत है। नट। हालांकि मैं उससे अधिक जटिल। – Stuart

+0

बस नए डेटा के साथ सवाल को अद्यतन करें। – Maiasaura

उत्तर

7

आप नयी आकृति प्रदान करना चाहते हैं और आप डुप्लिकेट, आप प्रत्येक जोड़ी में एक विशिष्ट आईडी देने की आवश्यकता के लिए जा रहे है:

idfoo <- cbind(id=fooids, foo) 

library(reshape) 
dcast(idfoo, id+grade~var.type, value.var="var.val") 

    id grade SE SS 
1 1  3 47 120 
2 2  4 46 120 
3 3  5 46 120 
4 4  6 47 120 
5 5  7 46 120 
6 6  8 46 120 
7 7  3 12 120 
8 8  4 14 120 
9 9  5 16 120 
10 10  6 20 120 
:

foorle <- rle(foo$grade) 
fooids <- rep(seq_len(length(foorle$values)), times=foorle$lengths) 

fooids 
[1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 

अब आप ठीक ढंग से नयी आकृति प्रदान का उपयोग करने में सक्षम हो जाएगा

संपादित करें: कृपया ध्यान दें कि मुझे लगता है कि आपका डेटा क्रम में है, अन्यथा आपको डुप्लिकेट के बीच अंतर करने में समस्याएं होंगी। यदि ऐसा नहीं है, तो आप हमेशा order का उपयोग कर सकते हैं ताकि यह हो।

+1

मैं भी [इस जवाब] (http://stackoverflow.com/a/12831856/1465387) को एक समान प्रश्न के लिए अनुशंसा करता हूं जो मुझे लगता है कि मेरे से बेहतर दृष्टिकोण है। –

2

यह रूप में सुंदर आकृति बदलें के रूप में नहीं है, लेकिन

data.frame(grade = foo[2 * (1:(nrow(foo)/2)),]$grade, 
      SS = foo[foo$var.type == "SS", ]$var.val, 
      SE = foo[foo$var.type == "SE", ]$var.val) 

grade SS SE 
1  3 120 47 
2  4 120 46 
3  5 120 46 
4  6 120 47 
5  7 120 46 
6  8 120 46 
7  3 120 12 
8  4 120 14 
9  5 120 16 
10  6 120 20 

आप डेटा ग्रहण करने के लिए है इस के लिए पंक्तियों की जोड़ी में आता पैदा करता है।

4
library(plyr) 
library(reshape2) 
# First we add a grouping variable to deal with the duplicates 
foo <- ddply(foo, .(grade, var.type), function(x) { x$group <- 1:nrow(x); x }) 
dcast(foo, grade + group ~ var.type, value.var= "var.val")[-2] 

grade SE SS 
1  3 47 120 
2  3 12 120 
3  4 46 120 
4  4 14 120 
5  5 46 120 
6  5 16 120 
7  6 47 120 
8  6 20 120 
9  7 46 120 
10  8 46 120 
0

नहीं डुप्लीकेट है, यह अच्छी तरह से काम करते हैं आप करते तो होगा:

ss <- subset(foo, var.type=='SS') 
se <- subset(foo, var.type=='SE') 
ss <- data.frame(grade=ss$grade,SS=ss$var.val) 
se <- data.frame(grade=se$grade,SE=se$var.val) 
bar <- merge(ss,se,by='grade') 
संबंधित मुद्दे