2014-10-23 8 views
57

Ich liebe die reshape2 Paket, weil es das Leben so verdammt einfach gemacht. In der Regel hat Hadley Verbesserungen in seinen früheren Paketen vorgenommen, die einen optimierten, schnelleren Code ermöglichen. Ich dachte, ich würde geben tidyr einen Wirbel und von dem, was ich lese, dachte ich gather war sehr ähnlich von reshape2. Aber nach dem Lesen der Dokumentation kann ich gather nicht die gleiche Aufgabe, die melt tut tun.Vergleichen sammeln (tidyr) zu schmelzen (reshape2)

Datenansicht

Hier ist ein Blick auf die Daten (Ist-Daten in dput Formular am Ende der post):

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 

-Code

Hier ist der Code in melt Mode , mein Versuch, gather. Wie kann ich gather dasselbe machen wie 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)) 

gewünschte Ausgabe

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 

Daten

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

Sie könnten an [diesem Vergleich der Pakete reshape2 und tidyr + dplyr] interessiert sein (http://rpubs.com/paul4forest/reshape2tidyrdplyr). Ich habe das Beispiel Luftqualität und Pommes frites verwendet, um die Verwendung der Funktionen reshape2 melt() und dcast() mit den Funktionen tidyr gather() und spread() kombiniert mit den Funktionen dplyr group_by() und summarize() zu vergleichen. –

Antwort

66

Ihre gather Linie sollte wie folgt aussehen:

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

Das sagt "Sammeln Sie alle Variablen außer teacher und pd und rufen Sie die neue Schlüsselspalte" Variable "und die neue Wertspalte" Datum "."


Als Erklärung muss folgendes beachtet werden vom help(gather) Seite:

...: 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. 

Da dies ein Auslassungszeichen ist, wird die Spezifikation von Spalten zu sammeln als separate (bare name) Argumente gegeben. Wir möchten alle Spalten außer teacher und pd sammeln, also verwenden wir -.

+11

'-c (Lehrer, PD)' scheint auch zu arbeiten. –

+3

Die Syntax macht jetzt vollkommen Sinn. Ich habe es vorher nicht gesehen. Danke für die tolle Antwort. –

+0

@BenBolker Ich mag das besser. Es hilft mir, Dinge in meinem Gehirn zu gruppieren. Es könnte auch weniger Tastenanschläge sein. –

Verwandte Themen