2014-10-23 7 views
57

Uwielbiam pakiet reshape2, ponieważ dzięki temu życie stało się tak łatwe. Zazwyczaj Hadley poczynił ulepszenia w swoich poprzednich pakietach, które umożliwiają usprawniony i szybszy kod. Pomyślałem, że dałbym tidyr wir i z tego, co przeczytałem, myślałem, że gather było bardzo podobne do melt z reshape2. Ale po przeczytaniu dokumentacji nie mogę uzyskać gather, aby wykonać to samo zadanie, które wykonuje melt.Porównywanie gather (tidyr) do topienia (reshape2)

Widok danych

Oto widok danych (dane rzeczywiste w dput formularz na końcu postu):

teacher yr1.baseline  pd yr1.lesson1 yr1.lesson2 yr2.lesson1 yr2.lesson2 yr2.lesson3 
1  3  1/13/09 2/5/09  3/6/09  4/27/09  10/7/09 11/18/09  3/4/10 
2  7  1/15/09 2/5/09  3/3/09  5/5/09 10/16/09 11/18/09  3/4/10 
3  8  1/27/09 2/5/09  3/3/09  4/27/09  10/7/09 11/18/09  3/5/10 

kod

Oto kod w melt modzie , moja próba na gather. Jak mogę zrobić gather zrobić to samo, co melt?

library(reshape2); library(dplyr); library(tidyr) 

dat %>% 
    melt(id=c("teacher", "pd"), value.name="date") 

dat %>% 
    gather(key=c(teacher, pd), value=date, -c(teacher, pd)) 

Pożądany Wyjście

teacher  pd  variable  date 
1  3 2/5/09 yr1.baseline 1/13/09 
2  7 2/5/09 yr1.baseline 1/15/09 
3  8 2/5/09 yr1.baseline 1/27/09 
4  3 2/5/09 yr1.lesson1 3/6/09 
5  7 2/5/09 yr1.lesson1 3/3/09 
6  8 2/5/09 yr1.lesson1 3/3/09 
7  3 2/5/09 yr1.lesson2 4/27/09 
8  7 2/5/09 yr1.lesson2 5/5/09 
9  8 2/5/09 yr1.lesson2 4/27/09 
10  3 2/5/09 yr2.lesson1 10/7/09 
11  7 2/5/09 yr2.lesson1 10/16/09 
12  8 2/5/09 yr2.lesson1 10/7/09 
13  3 2/5/09 yr2.lesson2 11/18/09 
14  7 2/5/09 yr2.lesson2 11/18/09 
15  8 2/5/09 yr2.lesson2 11/18/09 
16  3 2/5/09 yr2.lesson3 3/4/10 
17  7 2/5/09 yr2.lesson3 3/4/10 
18  8 2/5/09 yr2.lesson3 3/5/10 

danych

dat <- structure(list(teacher = structure(1:3, .Label = c("3", "7", 
    "8"), class = "factor"), yr1.baseline = structure(1:3, .Label = c("1/13/09", 
    "1/15/09", "1/27/09"), class = "factor"), pd = structure(c(1L, 
    1L, 1L), .Label = "2/5/09", class = "factor"), yr1.lesson1 = structure(c(2L, 
    1L, 1L), .Label = c("3/3/09", "3/6/09"), class = "factor"), yr1.lesson2 = structure(c(1L, 
    2L, 1L), .Label = c("4/27/09", "5/5/09"), class = "factor"), 
     yr2.lesson1 = structure(c(2L, 1L, 2L), .Label = c("10/16/09", 
     "10/7/09"), class = "factor"), yr2.lesson2 = structure(c(1L, 
     1L, 1L), .Label = "11/18/09", class = "factor"), yr2.lesson3 = structure(c(1L, 
     1L, 2L), .Label = c("3/4/10", "3/5/10"), class = "factor")), .Names = c("teacher", 
    "yr1.baseline", "pd", "yr1.lesson1", "yr1.lesson2", "yr2.lesson1", 
    "yr2.lesson2", "yr2.lesson3"), row.names = c(NA, -3L), class = "data.frame") 
+8

Być może zainteresuje Cię to [porównanie pakietów reshape2 i tidyr + dplyr] (http://rpubs.com/paul4forest/reshape2tidyrdplyr). Użyłem przykładu jakości powietrza i francuskiego frytki, aby porównać użycie funkcji topienia stopki (reshape2) i funkcji dcast() do funkcji tidyr gather() i spread() w połączeniu z funkcjami dplyr group_by() i summary(). –

Odpowiedz

66

Twój gather linia powinna wyglądać następująco:

dat %>% gather(variable, date, -teacher, -pd) 

Oznacza to, że "Zbierz wszystkie zmienne z wyjątkiem teacher i pd, wywołując nową kolumnę klucza" zmienna "i nową kolumnę wartości" data "."


jako wyjaśnienie, należy pamiętać, że od strony help(gather):

...: Specification of columns to gather. Use bare variable names. 
     Select all variables between x and z with ‘x:z’, exclude y 
     with ‘-y’. For more options, see the select documentation. 

Ponieważ jest to elipsa, specyfikacja kolumn do zbierają jest podawana jako oddzielne (gołe nazwa) argumentów. Chcemy zebrać wszystkie kolumny oprócz teacher i pd, więc używamy -.

+11

'-c (nauczyciel, pd)' wydaje się również działać. –

+3

Składnia ma teraz sens. Po prostu nie widziałem tego wcześniej. Dzięki za wspaniałą odpowiedź. –

+0

@BenBolker Podoba mi się to lepiej. Pomaga mi to grupować rzeczy w moim mózgu. Mogłoby też skończyć się mniejszą liczbą klawiszy. –

Powiązane problemy