2015-10-17 15 views
6

Mam ramki danych „DF” tak:R - Powielanie wiersze oparte na sekwencji daty rozpoczęcia i zakończenia

Flight.Start Flight.End Device  Partner Creative Days.in.Flight 
2015-08-31  2015-08-31 Standard MSN  Video  35 

co muszę zrobić, to „wysadzić” tak:

Flight.Start Flight.End Date   Device  Partner Creative Days.in.Flight 
2015-08-31  2015-10-04 2015-08-31 Standard MSN  Video  35 
2015-08-31  2015-10-04 2015-09-01 Standard MSN  Video  35 
2015-08-31  2015-10-04 2015-09-02 Standard MSN  Video  35 
2015-08-31  2015-10-04 2015-09-03 Standard MSN  Video  35 
2015-08-31  2015-10-04 2015-09-04 Standard MSN  Video  35 
2015-08-31  2015-10-04 2015-09-05 Standard MSN  Video  35 
2015-08-31  2015-10-04 2015-09-06 Standard MSN  Video  35 
2015-08-31  2015-10-04 2015-09-07 Standard MSN  Video  35 

ETC ...... dopóki zmienna uderza 2015-10-04 Data, a następnie przejść do następnego powielania

Zasadniczo każdy wiersz zostanie powielona przez ilość dni w locie - 1 (sinc Wiersz, który już istnieje, może stanowić pojedynczy dzień w przedziale, a następnie nowa kolumna "Data" jest wypełniana dla odpowiednich dat w ramach tego lotu. Jeśli więc wiersz ma datę rozpoczęcia i zakończenia odpowiednio 9/1 i 9/5, 4 zduplikowane wiersze zostaną dołączone do już istniejącego, zostanie utworzona nowa kolumna (Data) i sekwencja dat niezależnie od lotu daty początkowe i końcowe dotyczą oryginalnego wiersza, w którym zostaną wypełnione wartości kolumn.

Wszystkie wartości daty są sformatowane jako data, dni w locie to liczba, a reszta to czynniki.

EDIT

W odpowiedzi na duplikatu zapytania oznaczanie:

do wyjaśnienia, to nie podoba mi się przypadek, który został oznaczony jako duplikat, ponieważ moje pytanie nie jest naprawdę koncentruje się na jak duplikat oparty na dniach w locie (już wiem, jak to zrobić!), ale raczej jak mogę następnie dodać kolumnę do tej wyjściowej ramki danych i sekwencyjnie wstawiać daty w odpowiednim okresie lotu. Dzięki za heads-up ...

+0

hej @Jay, zdecydowanie nie, dzięki. Prawdopodobnie nie powinienem zawrzeć wszystkich informacji o duplikowaniu wierszy, ponieważ rozumiem, jak używać 'expandRows()', ale to pytanie jest bardziej o tym, jak wypełnić kolumnę daty sekwencyjnej, aby iść z tą ekspansją – YungBoy

Odpowiedz

1

Oto sposób to zrobić z podstawowej R:

mydf <- data.frame(Flight.Start = as.Date(c("2015-09-01", "2015-09-10")), 
        Flight.End = as.Date(c("2015-09-03", "2015-09-15")), 
        Device = "Standard", 
        Creative = "Video", 
        Days.in.Flight = c(3, 6), 
        stringsAsFactors = FALSE) 

expanded <-mydf[rep(row.names(mydf), mydf$ Days.in.Flight), ] 
data.frame(expanded,Date=expanded$Flight.Start+(sequence(mydf$Days.in.Flight)-1)) 

> data.frame(expanded,Date=expanded$Flight.Start+(sequence(mydf$Days.in.Flight)-1)) 
    Flight.Start Flight.End Device Creative Days.in.Flight  Date 
1  2015-09-01 2015-09-03 Standard Video    3 2015-09-01 
1.1 2015-09-01 2015-09-03 Standard Video    3 2015-09-02 
1.2 2015-09-01 2015-09-03 Standard Video    3 2015-09-03 
2  2015-09-10 2015-09-15 Standard Video    6 2015-09-10 
2.1 2015-09-10 2015-09-15 Standard Video    6 2015-09-11 
2.2 2015-09-10 2015-09-15 Standard Video    6 2015-09-12 
2.3 2015-09-10 2015-09-15 Standard Video    6 2015-09-13 
2.4 2015-09-10 2015-09-15 Standard Video    6 2015-09-14 
2.5 2015-09-10 2015-09-15 Standard Video    6 2015-09-15 
4

Oto jeden sposób z splitstackshape i dplyr. Korzystając z zestawu expandRows() z pakietu splitstackshape, można rozszerzyć ramkę danych zgodnie z opisem. Następnie chcesz dodać sekwencję dat za pomocą mutate(). To, co zrobiłem, to pogrupować dane za pomocą kombinacji Flight.Start i Flight.End i użyć seq(), aby utworzyć ciąg daty dla każdej grupy. first() bierze pierwszy element z Flight.Start i Flight.End. W ten sposób możesz stworzyć pożądaną sekwencję. Mam nadzieję, że to Ci pomoże.

dane i kod

mydf <- data.frame(Flight.Start = as.Date(c("2015-09-01", "2015-09-10")), 
        Flight.End = as.Date(c("2015-09-03", "2015-09-15")), 
        Device = "Standard", 
        Creative = "Video", 
        Days.in.Flight = c(3, 6), 
        stringsAsFactors = FALSE) 

# Flight.Start Flight.End Device Creative Days.in.Flight 
#1 2015-09-01 2015-09-03 Standard Video    3 
#2 2015-09-10 2015-09-15 Standard Video    6 

library(splitstackshape) 
library(dplyr) 

expandRows(mydf, "Days.in.Flight", drop = FALSE) %>% 
group_by(Flight.Start, Flight.End) %>% 
mutate(Date = seq(first(Flight.Start), 
        first(Flight.End), 
        by = 1)) 

# Flight.Start Flight.End Device Creative Days.in.Flight  Date 
#  (date)  (date) (chr) (chr)   (dbl)  (date) 
#1 2015-09-01 2015-09-03 Standard Video    3 2015-09-01 
#2 2015-09-01 2015-09-03 Standard Video    3 2015-09-02 
#3 2015-09-01 2015-09-03 Standard Video    3 2015-09-03 
#4 2015-09-10 2015-09-15 Standard Video    6 2015-09-10 
#5 2015-09-10 2015-09-15 Standard Video    6 2015-09-11 
#6 2015-09-10 2015-09-15 Standard Video    6 2015-09-12 
#7 2015-09-10 2015-09-15 Standard Video    6 2015-09-13 
#8 2015-09-10 2015-09-15 Standard Video    6 2015-09-14 
#9 2015-09-10 2015-09-15 Standard Video    6 2015-09-15 
4

lub używając data.table, możemy przekształcić 'data.frame' do „data.table "(setDT(mydf)), replikuj sekwencję wierszy za pomocą" Days.in.Flight ", w oparciu o ten indeks, podzbiór zestawu danych (.SD[rep(...), pogrupowane według" Flight.Start "i" Flight.End ", tworzymy Kolumna "Data".

library(data.table) 
setDT(mydf)[, .SD[rep(1:.N, Days.in.Flight)]][, 
    Date:= seq(Flight.Start , Flight.End, by = '1 day'), 
    by = .(Flight.Start, Flight.End)][] 
Powiązane problemy