Как отбросить строки за определенный промежуток времени от даты начала по группам в R? - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть следующий фрейм данных:

> df1

   ID  Timestamp            
1  A   2019-10-04
2  A   2019-10-06
3  A   2019-10-14
4  A   2019-10-22
5  A   2019-10-27
6  B   2019-12-02
7  B   2019-12-03
8  B   2019-12-31

Моя цель - отбросить все строки в группах за определенный промежуток времени (10 дней) с самой ранней отметки времени в группе на df1$ID в R. Таким образом, ожидаемый результат:

   ID  Timestamp            
1  A   2019-10-04
2  A   2019-10-06
3  A   2019-10-14
6  B   2019-12-02
7  B   2019-12-03

До сих пор мне удавалось только вычислить задержки по группам, но я не представлял, как дальше go.

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Как насчет dplyr решения:

library(dplyr)
# Timestamp as date
df1$Timestamp <- lubridate::ymd(df1$Timestamp)    

# here the job
df1 %>%
       # joining with a table that calculate the minimum date of each group 
       left_join(
                 df1 %>% group_by(ID) %>% summarise(dmin = min(Timestamp)))%>%  
       # add the difference in days
       mutate(dday = Timestamp - dmin) %>%
       # filter <= 10 and remove the useless column
       filter(dday <=10)%>% select(-dday, -dmin)

Joining, by = "ID"
  ID  Timestamp
1  A 2019-10-04
2  A 2019-10-06
3  A 2019-10-14
4  B 2019-12-02
5  B 2019-12-03
1 голос
/ 28 февраля 2020

Другим вариантом является фильтрация с использованием difftime():

library(dplyr)

df %>%
  mutate(Timestamp = as.Date(Timestamp)) %>%
  group_by(ID) %>%
  filter(difftime(Timestamp, first(Timestamp), units =  "days") <= 10)

# A tibble: 5 x 2
# Groups:   ID [2]
  ID    Timestamp 
  <fct> <date>    
1 A     2019-10-04
2 A     2019-10-06
3 A     2019-10-14
4 B     2019-12-02
5 B     2019-12-03
1 голос
/ 28 февраля 2020

в базе R вы можете использовать split - lapply - rbind вот так:

do.call(rbind, 
        lapply(split(df1, df1$ID), function(x) x[which(x$Timestamp - min(x$Timestamp) < 11),]))
#>     ID  Timestamp
#> A.1  A 2019-10-04
#> A.2  A 2019-10-06
#> A.3  A 2019-10-14
#> B.6  B 2019-12-02
#> B.7  B 2019-12-03
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...