2015-04-01 11 views
8

Verilerim gözlemler sipariş edildi ve manipülasyon yaparken mümkün olduğunca sipariş vermek istiyorum.Tidyr dosyasında örtülü sıralama :: spread ve dplyr :: summarise

this question cevabını alın, veri alanına "A" nın önüne "B" koyuyorum. Elde edilen geniş veri, "isim" sütunu, yani önce "A", sonra "B" ile sıralanır.

df = data.frame(name=c("B","B","A","A"), 
       group=c("g1","g2","g1","g2"), 
       V1=c(10,40,20,30), 
       V2=c(6,3,1,7)) 

gather(df, Var, Val, V1:V2) %>% 
unite(VarG, Var, group) %>% 
spread(VarG, Val) 

    name V1_g1 V1_g2 V2_g1 V2_g2 
1 A 20 30  1  7 
2 B 10 40  6  3 

Orijinal siparişi saklamanın bir yolu var mı?

name V1_g1 V1_g2 V2_g1 V2_g2 
1 B 10 40  6  3 
2 A 20 30  1  7 

04/02 düzenlemek: böyle sadece dplyr::summarise yanı sıralama gelmez bulduk. Siparişi geri yüklemek için arrange(name, df$name) hala çalışır. Ama paketlerin tasarımından ekstra ayırmanın gerekli olup olmadığını merak ediyorum.

df %>% 
    group_by(name) %>% 
    summarise(n()) %>% 

    name n() 
1 A 2 
2 B 2 
+0

İlginç. Yayılma aşamasında, "isim" değişkeni için faktör düzeyleri bile değişmiş gibi görünür. – A5C1D2H2I1M1N2O1R2T1

cevap

7

Orijinal veri çerçevesi sıraya göre ada göre sıralayabilirsiniz:

gather(df, Var, Val, V1:V2) %>% 
    unite(VarG, Var, group) %>% 
    spread(VarG, Val) %>% 
    arrange(order(match(name, df$name))) 

# name V1_g1 V1_g2 V2_g1 V2_g2 
# 1 B 10 40  6  3 
# 2 A 20 30  1  7 
+1

Teşekkürler. düzenlemek (eşleştirme (isim, df $ isim) 'de çalışır.Ama birden fazla gruplama seviyesi ile başa çıkma," isim "," isim1 "," isim2 "deyin. – Dong

+0

Seviyeye gelme konusunda haklısınız - Seviyelerde olduğu gibi - 'düzenlemek (a, b, c, ...) 'içinde birden fazla argüman kullanabilirsiniz ve istediğiniz gibi sıralayabilirsiniz (belki sadece göremiyorum Ama problemi çözdüğümde, acılarını anlıyorum. Herşeyi daha önce sıraladığım gibi ... – bergant

+0

@bergant, bana göre, sıralamadan başka büyük problem, faktör seviyelerinin değişmesidir. – A5C1D2H2I1M1N2O1R2T1

3

düzey faktör seviyelerinin sipariş alınır.

str(df) 
'data.frame': 4 obs. of 4 variables: 
$ name : Factor w/ 2 levels "A","B": 2 2 1 1 
$ group: Factor w/ 2 levels "g1","g2": 1 2 1 2 
$ V1 : num 10 40 20 30 
$ V2 : num 6 3 1 7 

Seviyelerin "A", "B" olduğunu görün.

Yani onlar işe yarayacak gösterilmektedir sipariş düzeylerinin sırasını ayarlarsanız: içinde

df = data.frame(name=c("B","B","A","A"), 
       group=c("g1","g2","g1","g2"), 
       V1=c(10,40,20,30), 
       V2=c(6,3,1,7)) 

df %>% 
    mutate(name = factor(name,levels=unique(name))) %>% 
    mutate(group = factor(group,levels=unique(group))) %>% 
    gather(Var, Val, V1:V2) %>% 
    unite(VarG, Var, group) %>% 
    spread(VarG, Val) 

Sonuçlar:

name V1_g1 V1_g2 V2_g1 V2_g2 
1 B 10 40  6  3 
2 A 20 30  1  7