Фильтрация событий сбора, если несколько событий сбора в одну и ту же дату, сохранить только первое событие - PullRequest
1 голос
/ 05 мая 2020

Я включил небольшую часть имеющихся у меня данных.

Он содержит даты терапевтических c уровней мониторинга наркотиков. Мне нужно включить только первое событие для пациентов, у которых несколько пациентов в тот же день, и удалить другие.

Я выделил несколько примеров на изображении ниже.

structure(list(id = c(3010013, 3010013, 3010013, 3010013, 3010013, 
3010013, 3010013, 3010013, 3010013, 3010013, 3010013, 3010013, 
3010013, 3010013, 3010013, 3010013, 3010013, 3010013, 3010013, 
3010013), DateCollected = structure(c(1131408000, 1131408000, 
1131408000, 1131408000, 1131494400, 1131580800, 1131580800, 1131580800, 
1131580800, 1131667200, 1131753600, 1131840000, 1131926400, 1131926400, 
1131926400, 1131926400, 1131926400, 1131926400, 1132012800, 1132099200
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Test = c("Cyclosporine", 
"Cyclosporine", "Cyclosporine", "Cyclosporine", "Cyclosporine", 
"Cyclosporine", "Cyclosporine", "Cyclosporine", "Cyclosporine", 
"Cyclosporine", "Cyclosporine", "Cyclosporine", "Cyclosporine", 
"Cyclosporine", "Cyclosporine", "Cyclosporine", "Cyclosporine", 
"Cyclosporine", "Cyclosporine", "Cyclosporine"), Result = c(222, 
233, 287, 368, 200, 167, 236, 286, 295, 313, 292, 252, 308, 358, 
982, 1905, 1965, 3881, 327, 400), Units = c("ug/L", "ug/L", "ug/L", 
"ug/L", "ug/L", "ug/L", "ug/L", "ug/L", "ug/L", "ug/L", "ug/L", 
"ug/L", "ug/L", "ug/L", "ug/L", "ug/L", "ug/L", "ug/L", "ug/L", 
"ug/L")), row.names = c(NA, -20L), class = c("tbl_df", "tbl", 
"data.frame"))

enter image description here

Ответы [ 3 ]

1 голос
/ 05 мая 2020

В base R мы можем использовать duplicated

df[!duplicated(df[c('id', 'DateCollected', 'Test')]),]

Или с filter и duplicated в dplyr

library(dplyr)
df %>% 
     filter(!duplicated(select(., id,  DateCollected, Test)))
# A tibble: 9 x 5
#       id DateCollected       Test         Result Units
#    <dbl> <dttm>              <chr>         <dbl> <chr>
#1 3010013 2005-11-08 00:00:00 Cyclosporine    222 ug/L 
#2 3010013 2005-11-09 00:00:00 Cyclosporine    200 ug/L 
#3 3010013 2005-11-10 00:00:00 Cyclosporine    167 ug/L 
#4 3010013 2005-11-11 00:00:00 Cyclosporine    313 ug/L 
#5 3010013 2005-11-12 00:00:00 Cyclosporine    292 ug/L 
#6 3010013 2005-11-13 00:00:00 Cyclosporine    252 ug/L 
#7 3010013 2005-11-14 00:00:00 Cyclosporine    308 ug/L 
#8 3010013 2005-11-15 00:00:00 Cyclosporine    327 ug/L 
#9 3010013 2005-11-16 00:00:00 Cyclosporine    400 ug/L 
0 голосов
/ 05 мая 2020

Вы можете group_by столбец, из которого вам нужна только одна строка. В этом случае вам может понадобиться только первая строка повторяющихся комбинаций id, DateCollected и Test.

library(dplyr)

df %>%
  group_by(id, DateCollected, Test) %>%
  slice(1)

Вывод

# A tibble: 9 x 5
# Groups:   id, DateCollected, Test [9]
       id DateCollected       Test         Result Units
    <dbl> <dttm>              <chr>         <dbl> <chr>
1 3010013 2005-11-08 00:00:00 Cyclosporine    222 ug/L 
2 3010013 2005-11-09 00:00:00 Cyclosporine    200 ug/L 
3 3010013 2005-11-10 00:00:00 Cyclosporine    167 ug/L 
4 3010013 2005-11-11 00:00:00 Cyclosporine    313 ug/L 
5 3010013 2005-11-12 00:00:00 Cyclosporine    292 ug/L 
6 3010013 2005-11-13 00:00:00 Cyclosporine    252 ug/L 
7 3010013 2005-11-14 00:00:00 Cyclosporine    308 ug/L 
8 3010013 2005-11-15 00:00:00 Cyclosporine    327 ug/L 
9 3010013 2005-11-16 00:00:00 Cyclosporine    400 ug/L 
0 голосов
/ 05 мая 2020

Использование dplyr package

> df %>% group_by(DateCollected) %>%
        summarize(id=first(id), first(Test), first(Result), first(Units)) %>% 
        ungroup()

## A tibble: 9 x 5
#  DateCollected            id `first(Test)` `first(Result)` `first(Units)`
#  <dttm>                <dbl> <chr>                   <dbl> <chr>         
#1 2005-11-08 00:00:00 3010013 Cyclosporine              222 ug/L          
#2 2005-11-09 00:00:00 3010013 Cyclosporine              200 ug/L          
#3 2005-11-10 00:00:00 3010013 Cyclosporine              167 ug/L          
#4 2005-11-11 00:00:00 3010013 Cyclosporine              313 ug/L          
#5 2005-11-12 00:00:00 3010013 Cyclosporine              292 ug/L          
#6 2005-11-13 00:00:00 3010013 Cyclosporine              252 ug/L          
#7 2005-11-14 00:00:00 3010013 Cyclosporine              308 ug/L          
#8 2005-11-15 00:00:00 3010013 Cyclosporine              327 ug/L          
#9 2005-11-16 00:00:00 3010013 Cyclosporine              400 ug/L 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...