2015-01-25 10 views
5

Sto cercando di capire gli argomenti per gather nel pacchetto tidyr.In tidyr, quali criteri usa la funzione `gather` per mappare un dataframe da ampio a lungo?

ho guardato la documentazione, e la sintassi si presenta come:

gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)

C'è un example nei file di aiuto:

stocks <- data.frame(
    time = as.Date('2009-01-01') + 0:9, 
    X = rnorm(10, 0, 1), 
    Y = rnorm(10, 0, 2), 
    Z = rnorm(10, 0, 4) 
) 

gather(stocks, stock, price, -time) 

Sono curioso di sapere l'ultima riga:
gather(stocks, stock, price, -time)

Qui, stocks sono chiaramente i dati che vogliamo modificare, il che va bene.

Quindi posso leggere che stock e price sono argomenti per una coppia di valori chiave - ma in che modo questa funzione decide come selezionare le colonne per creare questa coppia di valori chiave? Il dataframe originale si presenta così:

time  X   Y   Z 
2009-01-01 1.10177950 -1.1926213 -7.4149618 
2009-01-02 0.75578151 -4.3705737 -0.3117843 
2009-01-03 -0.23823356 -1.3497319 3.8742654 
2009-01-04 0.98744470 -4.2381224 0.7397038 
2009-01-05 0.74139013 -2.5303960 -5.5197743 

non vedo alcuna indicazione che dovremmo utilizzare qualsiasi combinazione di X, Y o Z. Quando sto usando questa funzione, mi sento come se stessi scegliendo i nomi per quello che voglio siano le colonne nel mio lungo dataframe formattato, e pregando che gather funzioni magicamente. Vieni a pensarci, mi sento allo stesso modo quando uso melt.

gather guarda il tipo di colonna? Come si mappa da ampio a lungo?

EDIT Grande risposta qui sotto, grande discussione di seguito, e per chiunque altro che vogliono più informazioni sulla filosofia e uso del pacchetto tidyr dovrebbe assolutamente leggere questo paper, anche se la vignetta non spiega la sintassi.

+0

Il '' tempo' dice di usare tutte le colonne tranne il tempo. Un altro approccio sarebbe utilizzare 'gather (stocks, stock, value, X: Z)', se si preferisce specificare quali colonne devono essere "raccolte". O anche, 'raccogliere (scorte, azioni, valore, X, Y, Z)'. Essenzialmente, questo è più come usare l'argomento 'melt' con' measure.vars' invece di specificare 'id.vars' (' melt (stocks, measure.vars = c ("X", "Y", "Z")) '). – A5C1D2H2I1M1N2O1R2T1

risposta

11

In "tidyr", si specificano le variabili di misura per gather nell'argomento .... Questo è un po 'diverso dal punto di vista concettuale da melt, dove molti esempi (anche molte risposte qui su SO) mostrerebbero l'uso dell'argomento id.vars (supponendo che tutto ciò che non è specificato come ID sia una misura).

L'argomento ... può anche assumere un nome di colonna -, come nell'esempio che è stato mostrato. Questo in pratica dice di "raccogliere tutte le colonne tranne questa". Un altro approccio stenografico in gather include la specifica di un intervallo di colonne utilizzando i due punti, ad esempio gather(stocks, stock, price, X:Z).

È possibile confrontare gather con melt osservando il codice per la funzione. Ecco le prime righe:

> tidyr:::gather_.data.frame 
function (data, key_col, value_col, gather_cols, na.rm = FALSE, 
    convert = FALSE) 
{ 
    data2 <- reshape2::melt(data, measure.vars = gather_cols, 
     variable.name = key_col, value.name = value_col, na.rm = na.rm) 
+0

Hmm ...È divertente che 'gather' sia solo un wrapper 'melt'. A che scopo creare questo? –

+0

@DavidArenburg, penso che ci sia solo una persona che conosce la risposta. 'spread' non è solo' dcast', quindi forse questo è solo un modello per ora? Mi sembra un po 'imbarazzante che la filosofia generale tra "reshape2" e "tidyr" diventi una discreta quantità, ma forse è per questo che è un pacchetto completamente diverso ... – A5C1D2H2I1M1N2O1R2T1

+3

@DavidArenburg il punto è che 'gather()' è in generale, è molto più facile da capire per le persone, ed è simmetrico con 'spread()' (a differenza di 'melt()' e 'cast()') – hadley

Problemi correlati