2011-03-13 14 views
8

Bu, Stata'nın tek adımda ele aldığı veri analizinde temel bir sorundur.Veri çerçevesini birden çok değişkenle ve bir zamanlar değişkeni ile değişkeni yeniden şekillendirin

d1 <- data.frame(subject = c("id1", "id2"), 
x0 = c("male", "female"), 
x1_2000 = 1:2, 
x1_2005 = 5:6, 
x2_2000 = 1:2, 
x2_2005 = 5:6  
) 

s.t.:

yıl 2000 ve 2005 (x1, x2) zamanı değişmez veri (x0) ve zamanla değişen verilerle geniş veri çerçevesini oluşturma

 subject  x0 time x1 x2 
1  id1 male 2000 1 1 
2  id2 female 2000 2 2 
3  id1 male 2005 5 5 
4  id2 female 2005 6 6 

Ben reshape s.t. ile yapabilirsiniz: Veri şuna benzer şekilde

subject x0 x1_2000 x1_2005 x2_2000 x2_2005 
1  id1 male   1  5  1  5 
2  id2 female  2  6  2  6 

Ben bir panel gibi şekillendirmek istiyor

d2 <-reshape(d1, 
idvar="subject", 
varying=list(c("x1_2000","x1_2005"), 
    c("x2_2000","x2_2005")), 
    v.names=c("x1","x2"), 
    times = c(2000,2005), 
    direction = "long", 
    sep= "_") 

Ana endişem, düzinelerce değişkeniniz olduğunda yukarıdaki komutun çok uzun sürmesi. stata yılında biri basitçe yazarsınız: R böyle basit bir çözüm

reshape long x1 x2, i(subject) j(year) 

var mı?

library(reshape2) 
library(stringr) 

# it is always useful to start with melt 
d2 <- melt(d1, id=c("subject", "x0")) 

# redefine the time and x1, x2, ... separately 
d2 <- transform(d2, time = str_replace(variable, "^.*_", ""), 
        variable = str_replace(variable, "_.*$", "")) 

# finally, cast as you want 
d3 <- dcast(d2, subject+x0+time~variable) 

şimdi bile belirtmeden x1 ve x2 gerekmez:

cevap

12

reshape onun tartışmaların çoğunu tahmin edebilirsiniz:
Bu kod değişkenleri artırmak çalışır. Bu durumda aşağıdakileri belirtmek yeterlidir. Hiçbir paket kullanılmamaktadır.

reshape(d1, dir = "long", varying = 3:6, sep = "_") 

vererek:

 subject  x0 time x1 x2 id 
1.2000  id1 male 2000 1 1 1 
2.2000  id2 female 2000 2 2 2 
1.2005  id1 male 2005 5 5 1 
2.2005  id2 female 2005 6 6 2 
+0

Güzel! Fakat değişkenler _sample_1_2000_ vs olarak adlandırıldığında ne olur? 'Sep = 'seçeneğiyle daha gerçekçi olabilir mi? – Fred

+2

@Fred, "böl" argümanını "sep" yerine kullan, yani "reshape (d1, dir =" long ", değişen = 3: 6, split = liste (regexp =" _2 ", include = TRUE)) 'ya da bu durumu söz konusu soruya indirgeyebiliriz, örneğin yeniden biçimlendir (setNames (d1, alt (" sample_ "," ", names (d1))), dir =" long ", değişen = 3: 6, sep = "_") ' –

4

burada reshape2 paketini kullanarak kısa bir örnek.

> d1 <- data.frame(subject = c("id1", "id2"), x0 = c("male", "female"), 
+ x1_2000 = 1:2, 
+ x1_2005 = 5:6, 
+ x2_2000 = 1:2, 
+ x2_2005 = 5:6, 
+ x3_2000 = 1:2, 
+ x3_2005 = 5:6, 
+ x4_2000 = 1:2, 
+ x4_2005 = 5:6 
+) 
> 
> d2 <- melt(d1, id=c("subject", "x0")) 
> d2 <- transform(d2, time = str_replace(variable, "^.*_", ""), 
+      variable = str_replace(variable, "_.*$", "")) 
> 
> d3 <- dcast(d2, subject+x0+time~variable) 
> 
> d3 
    subject  x0 time x1 x2 x3 x4 
1  id1 male 2000 1 1 1 1 
2  id1 male 2005 5 5 5 5 
3  id2 female 2000 2 2 2 2 
4  id2 female 2005 6 6 6 6 
+0

sayesinde bu yararlıdır. Dönüşümün ne yaptığı çok açık değil (yardım dosyası çok yararlı değil) ve "^. * _" 'Ve" ". * $" 'Yi nasıl yorumlayacağı. Bazı vars aslında "sample_1_2000" olarak adlandırılır çünkü soruyorlar ... – Fred

+0

Belki bu "sample_1_2000" adlı yıl verileri ile daha sezgisel ve benzeri: 'temp1 <- dönüşümü (temp, time = str_sub (variable, -4), variable = str_sub (değişken, 1, str_length (değişken) -5)) – Fred

+0

@Fred değişken adının biçimine bağlıdır. (en azından bir kısmı) karakterinin uzunluğu sabitse, yolunuz daha kolay olur. Aksi takdirde, düzenli ifade daha esnektir. – kohske