2015-03-19 7 views
10

ho dati che sembra qualcosa di simileDati lunghi e ampi con tidyR?

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

voglio rimodellare farlo sembrare come questo:

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

E 'possibile farlo con tidyR?

posso farlo con rimodellare

reshape(df, idvar='name', timevar='group', direction='wide') 

ma è sempre bene imparare qualcosa di nuovo.

risposta

12

Il codice reshape è compatto in quanto funziona per colonne a più valori. Utilizzando lo stesso in tidyr, potrebbe essere necessario un paio di passaggi. Convertire il formato 'wide' in 'long' usando gather in modo che ci sia una singola colonna 'Val', unite le colonne 'Var' (dal passaggio precedente) e 'gruppo' per creare una singola colonna 'VarG', quindi utilizzare spread per riconvertire il formato "lungo" a "largo".

library(tidyr) 
gather(df, Var, Val, V1:V2) %>% 
        unite(VarG, Var, group) %>% 
        spread(VarG, Val) 
# name V1_g1 V1_g2 V2_g1 V2_g2 
#1 A 10 40  6  3 
#2 B 20 30  1  7 
+0

La parte V1: V2 era nuova per me. Se si digita V1, si filtrano anche i dati. Questo è utile – jazzurro

+0

@jazzurro Penso che per più opzioni, '' select' da 'dplyr' sarebbe utile (ad esempio' starts_with, ends_with, ....) ' – akrun

+0

Grazie per il suggerimento. Applicherò le opzioni di selezione in 'gather()' d'ora in poi. – jazzurro

9

dcast in v1.9.5 data.table + grado di gestire più value.var colonne. Così possiamo fare:

require(data.table) # v1.9.5+ 
dcast(setDT(df), name ~ group, value.var=c("V1", "V2")) 
# name V1_g1 V1_g2 V2_g1 V2_g2 
# 1: A 10 40  6  3 
# 2: B 20 30  1  7 

Fondamentalmente, non c'è bisogno di fondere e lanciare, piuttosto direttamente cast. È possibile installarlo seguendo these instructions.