2017-11-01 1 views
5

Ich habe bereits nach mehreren Beispielen gesucht, aber ich habe keine gefiltert gefiltert Werte & ihre Daten gefunden.Spread() Datenrahmen basierend auf ID und Wert in einer anderen Spalte

Date <-c('3/13/2017 6:21', '3/20/2017 6:28','3/13/2017 6:22','3/20/2017 6:28',' 3/13/2017 6:23','3/20/2017 6:28','3/13/2017 6:24',' 3/20/2017 6:28', ' 3/24/2017 6:28') 
Enabled_value<-c(0,1,0,1,0,1,0,1,0) 
Helper<-c('39RTU1','39RTU1','39RTU2','39RTU2','39RTU2','39RTU3','39RTU3','39RTU4','39RTU4', '39RTU4') 

aussehen:

Helper  Date(Enabled Value =0)  Date (Enabled Value =1) 
39RTU1  3/13/2017 6:20   3/20/2017 6:28 
39RTU2  3/13/2017 6:21   3/20/2017 6:28 
39RTU3  3/13/2017 6:22   3/20/2017 6:28 
39RTU4  3/13/2017 6:24   3/20/2017 6:28 
39RTU4  3/24/2017 6:28 

Wie Sie sehen können, ich Zeitstempel für jede Beobachtung habe - jede Zeile sollte eine Instanz sein (dh von Enabled_value von 0 bis 1 zu bewegen, und wenn die letzten Enabled_value für die Einheit = 0, sollte es eine neue Zeile (siehe 39RTU4 unten).

ich habe bereits umfangreiche Arbeiten Reduzierung dieser Datensatz erfolgen (von 500k Zeilen bis 2k).

Ich versuche, tidyr und dplyr zu verwenden, aber mein spread hält laufende Fehler.

> sorted_data1<-spread(sorted_data,Enabled_Value,Helper) 
Error: Duplicate identifiers for rows (1340, 1342) 
+0

Ich denke, diese Frage zu https://stackoverflow.com/questions/47043098/transpose-columns-group-by-time-and-customer-id – markdly

Antwort

3

Es sieht so aus, als ob die Zeilen nicht eindeutig identifiziert werden, je nachdem, wie Sie versuchen zu verbreiten. Berechnen Sie also zuerst einen Index nach Helfer und aktiviertem Wert. (Hinweis: Ich habe Ihre Beispieldaten etwas geändert, weil einer von ihnen die Länge 10 hatte, während die anderen beiden die Länge 9 hatten).

Hoffentlich hilft das. Bitte zögern Sie nicht weiter zu klären, wenn dies nicht das ist, was Sie wollen.

Date <-c('3/13/2017 6:21', '3/20/2017 6:28','3/13/2017 6:22','3/20/2017 6:28',' 3/13/2017 6:23','3/20/2017 6:28','3/13/2017 6:24',' 3/20/2017 6:28', ' 3/24/2017 6:28') 
Enabled_value<-c(0,1,0,1,0,1,0,1,0) 
Helper<-c('39RTU1','39RTU1','39RTU2','39RTU2','39RTU2','39RTU3','39RTU3','39RTU4','39RTU4') 

df <- tibble(Date, Enabled_value, Helper) 
df %>% 
    group_by(Helper, Enabled_value) %>% 
    mutate(count = 1:n()) %>% 
    spread(Enabled_value, Date) %>% 
    rename(Enabled_value_0 = `0`, 
     Enabled_value_1 = `1`) 

# A tibble: 5 x 4 
# Groups: Helper [4] 
    Helper count Enabled_value_0 Enabled_value_1 
* <chr> <int>   <chr>   <chr> 
1 39RTU1  1 3/13/2017 6:21 3/20/2017 6:28 
2 39RTU2  1 3/13/2017 6:22 3/20/2017 6:28 
3 39RTU2  2 3/13/2017 6:23   <NA> 
4 39RTU3  1 3/13/2017 6:24 3/20/2017 6:28 
5 39RTU4  1 3/24/2017 6:28 3/20/2017 6:28 
+0

verwandt ist, wenn Sie 'mutate_at (Enabled_value hinzufügen, wie .zeichen) 'am Anfang Ihrer Rohrkette speichern Sie eine Zeile, etwas Klarheit und manuelle Umbenennung –

+0

Die Spaltennamen werden auch ohne das übertragen. Ich habe am Ende nur die manuelle Umbenennung vorgenommen, damit sie besser zusammenpassen (sonst wären die Spaltennamen "0" und "1"). Ich hätte auch eine Zeile innerhalb der Mutate hinzufügen können, die ich bereits habe, um "Enabled_value_" an jede Ziffer vor dem Spread einzufügen. Ich hatte tatsächlich das Gefühl, dass die manuelle Umbenennung in diesem Fall klarer war, aber sicherlich funktioniert beides. –

+0

oh, tut mir leid, ich habe zu schnell kommentiert –

Verwandte Themen