2010-07-23 13 views
5

Uzun ve geniş biçimli bir şekilde birleştirmek istediğim bir veri çerçevem ​​var, ancak genişlikte değişken adına gömülü zamana sahip olmak istiyorum. biçim. Ben başarılı olamadı baz Ar işlevini yeniden şekillendirmek kullanarak denedimYeni geniş değişken adında zamanla uzun ve geniş bir şekilde yeniden boyutlandırma

id var1.5 var1.10 var1.15 var1.20 .... 
1 0.71 1.71 -1.51 0.55 

(and so on) 

:

id <- as.numeric(rep(1,16)) 
time <- rep(c(5,10,15,20), 4) 
varname <- c(rep("var1",4), rep("var2", 4), rep("var3", 4), rep("var4", 4)) 
value <- rnorm(16) 
tmpdata <- as.data.frame(cbind(id, time, varname, value)) 

> tmpdata 
id time varname    value 
1 5 var1 0.713888426169224 
1 10 var1 1.71483653545922 
1 15 var1 -1.51992072577836 
1 20 var1 0.556992407683219 
.... 
4 20 var4 1.03752019932467 

aşağıdaki çıkışı ile geniş bir biçimde bu istiyorum: Burada uzun biçimi ile belirlenen bir örnek veridir ve örneklerin tümünün geniş formatta başka bir değişken olarak ortaya koyduğu gibi, yeniden şekillendirme paketini kullanarak bunu nasıl gerçekleştireceğimi bilemedim. Herhangi bir fikir?

cevap

13

Bu yeniden biçimlendirme paketi ile önemsiz (tmp için tmpdata, yapılan değer sayısal olarak değiştirildi):

library(reshape) 
cast(tmpdata, ... ~ varname + time) 
+0

Teşekkür ederim Hadley, kodunuz tam olarak aradığım şeyi yapıyor. Referansım için ... kimliğiyle değiştirdim, böylece bunu gelecekteki örnekler için hatırlıyorum. – sheed03

+0

Bu bağlamda '...', döküm belirtimine henüz dahil edilmemiş tüm diğer değişkenleri ifade eder. Birleştirme yapmıyorsanız, gerçek değişken adlarıyla değiştirmeniz gerekmez. – hadley

1

Yeniden şekillendirmeden önce neden sadece varı ve zamanı yapıştırmayın?

2

İki reshape adımında yapmam gerekiyordu. Satır başlıkları tam olarak ihtiyacınız olan şey olmayabilir, ancak kolayca yeniden adlandırılabilir.

id <- as.numeric(rep(1, 16)) 
time <- rep(c(5,10,15,20), 4) 
varname <- c(rep("var1",4), rep("var2", 4), rep("var3", 4), rep("var4", 4)) 
value <- rnorm(16) 
tmpdata <- as.data.frame(cbind(id, time, varname, value)) 

first <- reshape(tmpdata, timevar="time", idvar=c("id", "varname"), direction="wide") 
second <- reshape(first, timevar="varname", idvar="id", direction="wide") 

Ve çıkışı:

> tmpdata 
    id time varname    value 
1 1 5 var1 -0.231227494628982 
2 1 10 var1 -1.80887236653438 
3 1 15 var1 -0.443229294431553 
4 1 20 var1 1.33719337048763 
5 1 5 var2 0.673109282347586 
6 1 10 var2 -0.42142267953938 
7 1 15 var2 0.874367622725874 
8 1 20 var2 -1.19917678039462 
9 1 5 var3 1.13495606258399 
10 1 10 var3 -0.0779385346672042 
11 1 15 var3 -0.126775240288037 
12 1 20 var3 -0.760739300144526 
13 1 5 var4 -1.94626587907069 
14 1 10 var4 1.25643195699455 
15 1 15 var4 -0.50986941213717 
16 1 20 var4 -1.01324846239812 
> first 
    id varname   value.5   value.10   value.15 
1 1 var1 -0.231227494628982 -1.80887236653438 -0.443229294431553 
5 1 var2 0.673109282347586 -0.42142267953938 0.874367622725874 
9 1 var3 1.13495606258399 -0.0779385346672042 -0.126775240288037 
13 1 var4 -1.94626587907069 1.25643195699455 -0.50986941213717 
      value.20 
1 1.33719337048763 
5 -1.19917678039462 
9 -0.760739300144526 
13 -1.01324846239812 
> second 
    id  value.5.var1  value.10.var1  value.15.var1 value.20.var1 
1 1 -0.231227494628982 -1.80887236653438 -0.443229294431553 1.33719337048763 
     value.5.var2  value.10.var2  value.15.var2  value.20.var2 
1 0.673109282347586 -0.42142267953938 0.874367622725874 -1.19917678039462 
     value.5.var3  value.10.var3  value.15.var3  value.20.var3 
1 1.13495606258399 -0.0779385346672042 -0.126775240288037 -0.760739300144526 
     value.5.var4 value.10.var4  value.15.var4  value.20.var4 
1 -1.94626587907069 1.25643195699455 -0.50986941213717 -1.01324846239812 
+0

Ayrıca Hadley Wickham'ın 'Reshape' paketi kontrol etmek isteyebilirsiniz (Hiç kullanmadım. –

+0

Teşekkür ederim richardh, çözümünüz işe yaradı, ancak Hadley kodunu yeniden boyutlandırma paketini kullanarak kabul ettim çünkü yeni değişkenler isimleri tam olarak istediğim şekilde (var1_5, var1_10, vb.) Değişkendiler. . – sheed03

+0

@ sheed03 - Endişelenme yok. Hadley'nin yolu, bunu yapmak için bir yol değil. Ama onun sütunların sırasını değiştirdiğini fark ettim (diğer bir deyişle, 5 değerini en sağa koyar), bu yüzden çıktıya göz attığınızdan emin olun. –

2

2 yıl önce eski yenidenbiçimleme() komutu vazgeçti (değil Hadley). Her seferinde dışarı çıkmanın aslında daha zor olan 'zor' yoldan yapmaktan daha zor olduğunu düşünüyor gibi görünüyor.

Örneğinizdeki verileriniz birbirinden güzel şekilde sıralanmıştır. Gerçek verilerinizi önce var adına ve zamana göre sıralamanız gerekebilir.

y <- lapply(split(tmp, tmp$id), function(x) x$value) 
df <- data.frame(unique(tmp$id,), do.call(rbind,y)) 
names(df) <- c('id', as.character(tmp$time:tmp$var)) 
İlgili konular