Moja próbka data.table wygląda następującoKopiowanie wierszy wewnątrz data.table na podstawie stanu
Zaczynając danych
library(data.table)
x <- data.table(id = as.character(c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)),
time = as.character(c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)),
status = c("P", "R", "R", "R", "R", "P", "P", "P", "R", "R", "P", "P", "R", "R", "R"),
balance = c(100, 90, 80, 70, 60, 320, 300, 250, 200, 100, 40, 34, 31, 29, 10),
employment = c("Y", "Y", "Y", "N", "N", "N", "N", "N", "N", "Y", "N", "Y", "Y", "Y", "Y")
)
Celem jest, aby skopiować informacje w bilansie kolumnami i zatrudnienia, jeżeli status migruje z "P" do "R" przez "id". To znaczy. Chciałbym użyć danych z ostatniego okresu, w którym identyfikator to "P" i zastąpić istniejące informacje dla wszystkich kolejnych okresów, w których identyfikator to "R".
Stąd celem jest uzyskanie tego data.table
celem
Y <- data.table(id = as.character(c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)),
time = as.character(c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)),
status = c("P", "R", "R", "R", "R", "P", "P", "P", "R", "R", "P", "P", "R", "R", "R"),
balance = c(100, 100, 100, 100, 100, 320, 300, 250, 250, 250, 40, 34, 34, 34, 34),
employment = c("Y", "Y", "Y", "Y", "Y", "N", "N", "N", "N", "N", "N", "Y", "Y", "Y", "Y")
)
zauważyć, że czas kolumny i status itselft (i oczywiście id) nie zostaną naruszone.
Próbowałem użyć seq_len
przez id, a następnie ustawić tę kolumnę na zero, jeśli status to "R i wyszukaj maksymalną wartość (według id) tej kolumny, aby użyć jej jako wskaźnika, który wiersz musi zostać skopiowany. jestem pewien, że jest szybszy i lepszy sposób, aby rozwiązać ten problem. Może nawet jednego-liner.
Jeśli coś jest niejasne, proszę dać mi znać
Czy wszystkie identyfikatory zawsze zaczynają się od 'P'? –
Tak, cóż, zawsze zaczyna się od litery innej niż R (w tym przykładzie P) –
Tak więc część 'by' nie ma znaczenia Ja bym się domyślał –