2017-11-01 76 views
5

Już szukałem kilku przykładów, ale nie znalazłem żadnych filtrowanych wartości włączonych & ich dat.Ramka danych spread() na podstawie identyfikatora i wartość w innej kolumnie

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') 

wyglądać:

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 

Jak widać, mam sygnatury czasowe dla każdej obserwacji - każdy wiersz powinien być instancją (czyli przejście od Enabled_value od 0 do 1, a jeżeli ostatnia Enabled_value dla jednostki = 0, nie powinno być nową linię (patrz 39RTU4 poniżej).

już wykonał rozległe prace redukujący ten zestaw danych (od 500K do 2k wiersze).

Próbuję użyć tidyr i dplyr, ale mój spread nadal utrzymuje błędy.

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

Myślę, że to pytanie jest związane z https://stackoverflow.com/questions/47043098/transpose-columns-group-by-time-and-customer-id – markdly

Odpowiedz

3

Wygląda na to, że wiersze nie są jednoznacznie identyfikowane w zależności od sposobu, w jaki próbujesz się rozprzestrzeniać. Najpierw obliczyć indeks według pomocnika i włączoną wartość. (Uwaga: trochę zmieniłem dane przykładowe, ponieważ jeden z nich miał długość 10, a pozostałe dwie długości 9).

Mam nadzieję, że to pomoże. Zachęcamy do dalszego wyjaśnienia, jeśli nie jest to, czego chcesz.

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

jeśli dodać 'mutate_at (Enabled_value, jak .character) 'na początku twojego łańcucha rur zapisujesz jedną linię, pewną przejrzystość i ręczną zmianę nazwy –

+0

Nazwy kolumn zostaną przeniesione nawet bez tego. Właśnie dokonałem ręcznej zmiany nazwy na końcu, aby je lepiej dopasować (w przeciwnym razie nazwy kolumn byłyby "0" i "1"). Mógłbym też dodać linię wewnątrz mutacji, którą już muszę wkleić "Enabled_value_" do każdej cyfry przed spreadem. Czułem, że ręczne zmienianie nazwy było bardziej jasne w tym przypadku, ale z pewnością działa. –

+0

o tak, przepraszam, komentowałem zbyt szybko –