2012-10-10 24 views
8

Basit bir yeniden biçimlendirme problemi olmalıyım, ancak bunu anlayamıyorum. verilerim Bölüm şuna benzer:Yinelenen veri çerçevesini yeniden şekillendirme

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") 

veya

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 

Ben bu gibi görünmesi istiyorum: böyle devam

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

ve.

Reshaping dataset

ama işe yaramış görünüyor: Bu iş parçacığı olduğu gibi yeniden biçimlendirme, döküm ve dcast çalıştılar. Bazı yardımları gerçekten takdir ederim. TIA.

+2

, ('grade' ile bir satır olduğu için, "var.type", "var.val") = (3, SE, 47), yanı sıra (3, SE, 12). 'SE 'sütununda hangi var.val'ı görünmek istersiniz? –

+0

Oh, pardon. Batırdım. Eklemem gereken başka bir değişken var gibi görünüyor. Fındık. Yine de benden daha karmaşık. – Stuart

+0

Soruyu yeni verilerle güncelleyin. – Maiasaura

cevap

7

Eğer yeniden şekillendirmek istiyor ve çiftleri, her çifti benzersiz bir kimlik vermek ihtiyacımız olacak varsa:

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 

Şimdi düzgün yeniden şekillendirmek kullanmak mümkün olacak

DÜZENLEME: Lütfen, verilerinizin sıralı olduğunu varsayarak yinelemeler arasında ayrım yapmakta sorun yaşarsınız. Değilse, her zaman order'u kullanabilirsiniz.

+1

Ayrıca [bu yanıtı] (http://stackoverflow.com/a/12831856/1465387) benimkinden daha iyi bir yaklaşıma sahip olduğunu düşündüğüm benzer bir soruyu tavsiye ediyorum. –

2

Bu reshape kadar güzel değil, ama

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 

Verileri üstlenmek zorunda bunun için satır çiftler halinde gelir üretir.

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

Tüm çoğaltmaları var, bu güzel çalışacaktır değil Eğer do ise: Yukarıdaki bize verdiği örnek verilerde

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') 
İlgili konular