2016-06-13 9 views
1

Dies ist mein Datenframe.Ifelp-Anweisung mit verschachtelten data.table-Anweisungen

library(data.table) 
    dt <- fread(' 
Name  Video Webinar Meeting Conference Level NextStep 
    John  1   0  0  0  1  Webinar,Meeting,Conference 
    John  1   1  0  0  1  Meeting,Conference 
    John  1   1  1  0  2  Conference  
    Tom  0   0  1  0  1  Webinar,Conference,Video 
    Tom  0   0  1  1  2  Webinar,Video 
    Kyle  0   0  0  1  2  Webinar,Meeting,Video 

           ') 

Ich schaffe die nextstep Spalte, indem Sie diese

dt[, nextstep := paste0(names(.SD)[.SD==0], collapse = ','), 1:nrow(DT), .SDcols = 2:5][] 

nach der Lösung hier Making a character string with column names with zero values

Jetzt möchte ich die Reihenfolge ändern, wie die Elemente im nächsten Schritt zeigen Spalte basierend auf dem Feld "Level". Wenn es beispielsweise Ebene 1 ist, möchte ich, dass die Konferenz vor dem Webinar & Meeting angezeigt wird. Wenn Level 2 ist, möchte ich, dass das Video immer zuletzt angezeigt wird. Dies ist mein Versuch.

Ich versuche nur die Elemente innerhalb 'Nextstep' Feld basierend auf dem 'Level' Feld neu zu ordnen. Vielen Dank für Ihre Hilfe!

Antwort

4

Nun können Sie Ihre bevorzugte Reihenfolge irgendwo setzen:

levelmap = data.table(Level = 1:2, ord = list(
    c("Conference", "Webinar", "Meeting", "Video"), 
    c("Webinar", "Meeting", "Conference", "Video") 
)) 

Und dann Ihren bisherigen Ansatz verwenden:

DT[, r := .I] 
for (ii in seq(nrow(levelmap))) 
    DT[ Level == levelmap$Level[ii], 
     ns := paste0(names(.SD)[.SD==0], collapse = ',') 
    , by = r, .SDcols = levelmap$ord[[ii]] ][] 

Aber wirklich, ich glaube, Sie sollten nicht tun an alles (was ist in dieser Frage noch die vorherige). Es ist eine chaotische Art, mit Daten umzugehen.

Kommentar zu sauberen Daten. Um zu verdeutlichen, was ich damit meine, würde ich empfehlen, Hadley Wickhams paper on tidy data zu überprüfen. Tidy Daten hier würde wahrscheinlich so aussehen:

myDT = melt(
    DT[, !"NextStep", with=FALSE][, Seq := 1:.N, by=Name], 
    id.var = c("Name", "Seq", "Level")) 

    Name Seq Level variable value 
1: John 1  1  Video  1 
2: John 2  1  Video  1 
3: John 3  2  Video  1 
4: Tom 1  1  Video  0 
5: Tom 2  2  Video  0 
6: Kyle 1  2  Video  0 
7: John 1  1 Webinar  0 
8: John 2  1 Webinar  1 
9: John 3  2 Webinar  1 
10: Tom 1  1 Webinar  0 
11: Tom 2  2 Webinar  0 
12: Kyle 1  2 Webinar  0 
13: John 1  1 Meeting  0 
14: John 2  1 Meeting  0 
15: John 3  2 Meeting  1 
16: Tom 1  1 Meeting  1 
17: Tom 2  2 Meeting  1 
18: Kyle 1  2 Meeting  0 
19: John 1  1 Conference  0 
20: John 2  1 Conference  0 
21: John 3  2 Conference  0 
22: Tom 1  1 Conference  0 
23: Tom 2  2 Conference  1 
24: Kyle 1  2 Conference  1 
    Name Seq Level variable value 

Oder vielleicht möchten Sie auch alle Zeilen löschen, die Nullen sind, oder die Einsen (da sie ziemlich redundant sind).

Die Idee ist, dass dies Ihre wichtigsten Daten sind, die Sie für die Analyse oder den Aufbau von Übersichtstabellen verwenden. In Ihrem Fall ist das Ziel, eine Übersichtstabelle (soweit ich das beurteilen kann), wie

library(magrittr) 
res = myDT[levelmap, on="Level"][, .(NextStep = 
    variable[value == 0] %>% factor(levels = ord[[1]]) %>% sort %>% toString 
), keyby=.(Name, Seq, Level)] 

    Name Seq Level      NextStep 
1: John 1  1 Conference, Webinar, Meeting 
2: John 2  1   Conference, Meeting 
3: John 3  2     Conference 
4: Kyle 1  2  Webinar, Meeting, Video 
5: Tom 1  1 Conference, Webinar, Video 
6: Tom 2  2    Webinar, Video 

Wenn Sie wirklich die 0/1 Spalten wollten, könnten Sie auch sie sind mit dcast (die Daten aus Lang verwandelt zu breit):

cbind(
    res, 
    dcast(myDT, Name + Seq ~ variable, value.var="value")[, !c("Name", "Seq"), with=FALSE]) 
+0

Vielen Dank für Ihre Antwort Frank.Kindly lassen Sie mich wissen, was Sie beziehen, wenn Sie sagen, es ist eine chaotische Art, mit Daten umzugehen. Meinst du, wie ich die Nextstep-Spalte erzeuge? – gibbz00

+0

@ gibbz00 Grundsätzlich meine ich, dass Sie keine Analyse mit Daten im Wide-Format durchführen sollten (wo Sie "Daten" als Spaltennamen gespeichert haben). – Frank

+1

Vielen Dank für die ausführliche Erklärung! Ich habe so viel von dir gelernt. – gibbz00