2014-10-06 9 views
5

Stavo manipolando i miei dati e ho scoperto che ho fatto qualcosa di sbagliato in qualche punto del processo. Quando ho esplorato il problema, il problema si è verificato nel seguente comportamento di spread() nel pacchetto tidyr.come spread() in tidyr gestisce i livelli di fattore

Ecco un esempio dimostrativo. Diciamo che abbiamo una cornice dati come la seguente.

> d <- data.frame(factor1 = rep(LETTERS[1:3], each = 3), 
+ factor2 = rep(paste0("level", c(1, 2, 10)), 3), 
+ num = 1:9 
+) 
> d 
    factor1 factor2 num 
1  A level1 1 
2  A level2 2 
3  A level10 3 
4  B level1 4 
5  B level2 5 
6  B level10 6 
7  C level1 7 
8  C level2 8 
9  C level10 9 

Quello che volevo fare era convertire questo frame di dati con formattazione lunga in formato wide. E ho pensato che spread() è una strada da percorrere. Il risultato, tuttavia, non era quello che mi aspettavo.

> spread(d, factor2, num) 
    factor1 level1 level2 level10 
1  A  1  3  2 
2  B  4  6  5 
3  C  7  9  8 

Se factor1 è "A" e factor2 è "Level2", il valore dovrebbe essere di 2, ma il grande formato risultante dice 3. A quanto pare, il num è ordinato per ordine alfabetico factor2 (level1> level10 > level2) e viene inserito nel formato wide. Ma quando lo è, le etichette factor2 mantengono lo stesso ordine in cui appaiono nel frame di dati originale (livello1> livello2> livello10).

Qualcuno potrebbe spiegare perché questo accade (e/o dove posso trovare informazioni rilevanti)?

+0

Utilizzando la versione devel di 'tidyr', i colnames corrispondono ai numeri, ma l'ordine delle colonne è' level1, level10, level2'. Anche questo sembra essere risolto da 'd $ factor2 <- factor (d $ factor2, levels = c ('level1', 'level2', 'level10')); spread (d, factor2, num) ' – akrun

+0

Ho' tidyr' versione 0.1 e ho ottenuto il risultato corretto usando il tuo codice. Forse dovresti riavviare R e vedere se questo cambia le cose? –

+0

Sembra che stavo usando la versione di sviluppo. Quando ho installato quello corrente da CRAN, ha funzionato bene. Grazie a @akrun per averlo indicato. –

risposta

8

Utilizzando i dati forniti, ho ottenuto risultati diversi:

> packageVersion("tidyr") 
[1] ‘0.1’ 
spread(d, factor2, num) 
    factor1 level1 level10 level2 
1  A  1  3  2 
2  B  4  6  5 
3  C  7  9  8 
+0

Ho controllato la versione del pacchetto prima di pubblicare, e dal momento che ha detto 0.1 ho pensato che fosse l'ultima versione. Ma come ho detto @akrun, stavo usando la versione di sviluppo che ho scaricato da github. Quando ho installato il pacchetto da CRAN, ha funzionato correttamente. Grazie! –

Problemi correlati