2016-06-09 10 views
1

Die vierte Spalte ist meine gewünschte Spalte. Video, Webinar, Besprechung, Konferenz sind die vier Arten von Aktivitäten, an denen sich die verschiedenen Kunden (Namen) beteiligen können. Sie können sehen, dass in einer gegebenen Zeile alle Spaltennamen mit dem Wert Null in der letzten Spalte (NextStep) und der Wert dort (durch Komma getrennte Zeichenkette) schließt den Spaltennamen mit einem Wert ungleich Null aus. Die Zeichenfolgen (Spaltennamen) in der letzten Spalte erscheinen normalerweise in der Reihenfolge der Spalten mit zwei Ausnahmen. Webinar erscheint immer zuerst, wenn es einen Nullwert hat und Video immer zuletzt erscheint, wenn es einen Nullwert hat.Eine Zeichenkette mit Spaltennamen mit Nullwerten erstellen

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

            ') 

Meine Frage ist, wie Sie die nächste Schrittspalte erstellen. Vielen dank für Deine Hilfe!

+0

.. und Ihre Frage ist, wie Spalte NextStep erstellen? Und was ist 'dt [, Datum: = as.IDate (Datum)]' für? –

+0

Ja, es ist, wie die nächste Schrittspalte erstellt wird. – gibbz00

+0

Bitte fügen Sie eine explizite Frage in Ihrem Beitrag –

Antwort

3

Eine mögliche Lösung:

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

die gibt:

Name Video Webinar Meeting Conference     nextstep 
1: John  1  0  0   0 Webinar,Meeting,Conference 
2: John  1  1  0   0   Meeting,Conference 
3: John  1  1  1   0     Conference 
4: Tom  0  0  1   0 Video,Webinar,Conference 
5: Tom  0  0  1   1    Video,Webinar 
6: Kyle  0  0  0   1  Video,Webinar,Meeting 

Wenn Sie die Namen bestellen, wie Sie in den Kommentaren angegeben, können Sie tun:

lvls <- c('Webinar', 'Meeting', 'Conference', 'Video') 
DT[, nextstep := paste0(lvls[lvls %in% names(.SD)[.SD==0]], collapse = ','), 
    1:nrow(DT), .SDcols = 2:5][] 

was gibt:

Name Video Webinar Meeting Conference     nextstep 
1: John  1  0  0   0 Webinar,Meeting,Conference 
2: John  1  1  0   0   Meeting,Conference 
3: John  1  1  1   0     Conference 
4: Tom  0  0  1   0 Webinar,Conference,Video 
5: Tom  0  0  1   1    Webinar,Video 
6: Kyle  0  0  0   1  Webinar,Meeting,Video 

Statt paste0 der Verwendung (mit collapse = ',') auch toString verwenden können.


Gebrauchte Daten:

DT <- fread('Name  Video Webinar Meeting Conference 
      John  1   0  0  0 
      John  1   1  0  0 
      John  1   1  1  0 
      Tom  0   0  1  0 
      Tom  0   0  1  1 
      Kyle  0   0  0  1') 
+0

Vielen Dank für die tolle Lösung. Gibt es eine Möglichkeit, dass Webinar immer zuerst angezeigt wird und Video immer zuletzt im Feld nextstep2 angezeigt wird? – gibbz00

+0

@ gibbz00 und was ist mit "Meeting" und "Konferenz"? – Jaap

+0

Bei Besprechung und Konferenz können wir auf die Spaltenreihenfolge zurückgreifen, in der das Treffen vor der Konferenz stattfindet. – gibbz00

1

Hier gehen Sie:

setcolorder(dt, c("Name", "Webinar", "Meeting", "Conference", "Video", "NextStep")) 
dt[, NextStepNew:=apply(dt, 1, function(x) paste0(names(x)[x==0], collapse=","))][] 
    Name Webinar Meeting Conference Video     NextStep    NextStepNew 
1: John  0  0   0  1 Webinar,Meeting,Conference Webinar,Meeting,Conference 
2: John  1  0   0  1   Meeting,Conference   Meeting,Conference 
3: John  1  1   0  1     Conference     Conference 
4: Tom  0  1   0  0 Webinar,Conference,Video Webinar,Conference,Video 
5: Tom  0  1   1  0    Webinar,Video    Webinar,Video 
6: Kyle  0  0   1  0  Webinar,Meeting,Video  Webinar,Meeting,Video 
+0

Vielen Dank für die Antwort! – gibbz00

4

Falls Sie nach einer Möglichkeit suchen, dies zu tun, ohne einfach die Spalten in der Reihenfolge wieder Bestellung Sie wollen (in der Tat sehe ich keinen Grund, warum nicht, aber trotzdem ..) Sie könnten den folgenden Ansatz versuchen. Es melt s und Updates durch Bezugnahme in einem Join:

lvls <- c("Webinar", "Meeting", "Conference", "Video") # make sure order is correct 
dt[, row := .I] # add a row-identifier 
dtm <- melt(dt, id.vars = c("Name", "row"), measure.vars = lvls) # melt to long format 
# summarise dtm by using factor, sorting it and converting to strin; then join to dt 
dt[dtm[value == 0, list(NextStep2 = toString(sort(factor(variable, levels = lvls)))), 
    by = row], NextStep2 := NextStep2, on = "row"][, row := NULL] 

# Name Video Webinar Meeting Conference     NextStep     NextStep2 
# 1: John  1  0  0   0 Webinar,Meeting,Conference Webinar, Meeting, Conference 
# 2: John  1  1  0   0   Meeting,Conference   Meeting, Conference 
# 3: John  1  1  1   0     Conference     Conference 
# 4: Tom  0  0  1   0 Webinar,Conference,Video Webinar, Conference, Video 
# 5: Tom  0  0  1   1    Webinar,Video    Webinar, Video 
# 6: Kyle  0  0  0   1  Webinar,Meeting,Video  Webinar, Meeting, Video 

Wenn Sie alle Spaltennamen in den Daten für die Fälle eingefügt werden soll, wo es keine Aktivität ist, können Sie die folgende Zeile in Ihrem Code hinzufügen:

dt[rowSums(dt[, mget(lvls)]) == 0, NextStep2 := toString(names(dt)[2:5])] 
+0

Vielen Dank für die großartige Lösung.Für jemanden, der keine Aktivität hat, also die ganze Spalte ist Null, in diesem Fall möchte ich Video, Webinar, Meeting, Konferenz genauso machen, wie die Spaltenreihenfolge im ursprünglichen Datenrahmen erscheint. – gibbz00

+0

@ gibbz00, werfen Sie einen Blick auf das Update –

+0

Vielen Dank! – gibbz00