2015-01-25 5 views
5

Próbuję obliczyć argumenty dla gather w pakiecie tidyr.W tidyr, jakie kryteria używa funkcja `gather` do mapowania ramek danych z szerokiego na długi?

spojrzałem na dokumentacji, a składnia wygląda następująco:

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

Jest example w plikach pomocy:

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) 

Jestem ciekaw ostatnim wierszu:

Tutaj, stocks to oczywiście dane, które chcemy zmodyfikować, co jest w porządku.

Dzięki temu mogę przeczytać, że stock i price są argumentami pary klucz-wartość - ale w jaki sposób ta funkcja decyduje o wyborze kolumn do utworzenia tej pary wartości klucza? Oryginalny dataframe wygląda następująco:

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 

nie widzę żadnych oznak, że powinniśmy użyć dowolnej kombinacji X, Y lub Z. Kiedy używam tej funkcji, mam wrażenie, że właśnie wybieram nazwy dla tego, co chcę, aby kolumny w mojej długiej formatowanej ramce danych były i modląc się, że magicznie działa gather. Pomyśl o tym, czuję to samo, kiedy używam melt.

Czy gather wygląda na typ kolumny? Jak zmienia się mapa z długiej na długą?

EDIT Świetna odpowiedź poniżej, wielka dyskusja poniżej, i dla nikogo innego chce się więcej informacji na temat filozofii i korzystania z pakietu tidyr zdecydowanie powinni przeczytać tę paper, chociaż winieta nie wyjaśnia składnię.

+0

"Czas" mówi o użyciu wszystkich kolumn z wyjątkiem czasu. Innym podejściem byłoby użycie 'gather (akcje, magazyn, wartość, X: Z)', jeśli wolisz określić, które kolumny powinny być "zebrane". Albo nawet: 'gather (akcje, zapasy, wartość, X, Y, Z)'. Zasadniczo jest to bardziej jak użycie 'melt' z argumentem' measure.vars' zamiast określania 'id.vars' (' stop (akcje, measure.vars = c ("X", "Y", "Z")) '). – A5C1D2H2I1M1N2O1R2T1

Odpowiedz

11

W "tidyr" określasz zmienne miary dla gather w argumencie .... Jest to trochę inna koncepcja od melt, gdzie wiele przykładów (nawet wiele odpowiedzi tutaj na SO) pokazywałoby użycie argumentu id.vars (przy założeniu, że wszystko, co nie jest określone jako ID, jest pomiarem).

Argument ... może również przyjmować nazwę kolumny -, tak jak w pokazanym przykładzie. Zasadniczo mówi się o "zebraniu wszystkich kolumn poza tym jednym". Inne skrótowe podejście w dokumencie gather obejmuje określenie zakresu kolumn za pomocą dwukropka, na przykład gather(stocks, stock, price, X:Z).

Możesz porównać gather z melt, patrząc na kod funkcji. Oto kilka pierwszych linii:

> 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 ...To zabawne, że 'gather' to po prostu' topienie się '. Jaki był sens tworzenia? –

+0

@DavidArenburg, myślę, że jest tylko jedna osoba, która zna odpowiedź na to pytanie. 'spread' to nie tylko' dcast', więc może to tylko szablon na teraz? Wydaje mi się trochę niezręczne, że ogólna filozofia pomiędzy "reshape2" i "tidyr" różni się znacznie, ale może dlatego jest to zupełnie inny pakiet ... – A5C1D2H2I1M1N2O1R2T1

+3

@DavidArenburg chodzi o to, że 'gather()' jest ogólnie rzecz biorąc, o wiele łatwiejsze do zrozumienia przez ludzi, i jest symetryczne z 'spread()' (w przeciwieństwie do 'melt()' i 'cast()') – hadley

Powiązane problemy