Wewnątrz każdego id
, chciałbym zachować wiersze, które są co najmniej 91 dni od siebie. W mojej ramce danych df
poniżej, id=1
ma 5 wierszy i id=2
ma 1 wiersz.Jak filtrować wiersze na podstawie różnicy dat między wierszami w R?
Dla id=1
, chciałbym zachować tylko 1., 3. i 5. wiersz.
Dzieje się tak, ponieważ jeśli porównamy pierwszą datę i drugą datę, różnią się one o 32 dni. Usuń więc drugą datę. Porównujemy pierwszą i trzecią datę i różnią się one o 152 dni. Tak więc trzymamy 3 datę.
Teraz zamiast pierwszej daty jako odniesienia używamy 3. daty. Trzecia data i czwarta data różnią się o 61 dni. Usuń więc czwartą datę. Porównujemy 3 datę i 5 datę, a różnią się one o 121 dni. Tak więc trzymamy 5. randkę.
Ostatecznie daty, w których się zatrzymujemy, to daty 1, 3 i 5. Jeśli chodzi o id=2
, jest tylko jeden wiersz, więc trzymamy to. Pożądany wynik jest pokazany w dfnew
.
df <- read.table(header = TRUE, text = "
id var1 date
1 A 2006-01-01
1 B 2006-02-02
1 C 2006-06-02
1 D 2006-08-02
1 E 2007-12-01
2 F 2007-04-20
",stringsAsFactors=FALSE)
dfnew <- read.table(header = TRUE, text = "
id var1 date
1 A 2006-01-01
1 C 2006-06-02
1 E 2007-12-01
2 F 2007-04-20
",stringsAsFactors=FALSE)
mogę myśleć tylko o zaczynając grupowania df
przez id
następująco:
library(dplyr)
dfnew <- df %>% group_by(id)
Jednak nie jestem pewien, w jaki sposób dalej stąd. Czy powinienem wykonać funkcję filter
lub slice
? Jeśli tak to jak?
Może przekonwertować na dzień spełnienia wymogu 'klasy pierwszej zamiast robić to przez grupy –
@DavidArenburg: Dziękuję, twoje komentarze są zawsze bardzo doceniane. Dokonałem edycji. – aichao