Удалить строки в группе, если выполнены условия другой строки - PullRequest
0 голосов
/ 02 июля 2018

У меня есть фрейм данных df (+/- 331000 наблюдений с 4 переменными) с Date (диапазон в формате = "% Y-% m-% d"), ID (коэффициент с 19 уровней), Station (фактор с 18 уровнями) и Presence (1/0). Фрейм данных настроен таким образом, что существует диапазон дат (в течение почти трехлетнего периода) для каждого ID в каждом Station, и присутствует ли человек (1/0) в определенный день в конкретная станция.

Если кто-то поднастроит / отфильтрует df по дню и идентификатору, вы получите следующий набор данных (теперь я буду называть это «группой»):

filter(df, Date == "2016-01-03" & ID == "Fred")
 Date           ID     Station       Presence
 <date>         <fct>  <fct>         <dbl>
 2016-01-03     Fred   Station1      0 
 2016-01-03     Fred   Station2      0 
 2016-01-03     Fred   Station3      0 
 2016-01-03     Fred   Station4      1
 2016-01-03     Fred   Station5      0 
 2016-01-03     Fred   Station6      0 
 2016-01-03     Fred   Station7      0 
 2016-01-03     Fred   Station8      0 
 2016-01-03     Fred   Station9      0 
 2016-01-03     Fred   Station10     0 
 2016-01-03     Fred   Station11     0 
 2016-01-03     Fred   Station12     0 
 2016-01-03     Fred   Station13     0
 2016-01-03     Fred   Station14     0 
 2016-01-03     Fred   Station15     0 
 2016-01-03     Fred   Station16     0 
 2016-01-03     Fred   Station17     0 
 2016-01-03     Fred   Station18     0 

Я хотел бы удалить строки из группы, если выполняются следующие условия: Для каждой группы, если df$Presence == 1, удалите строки с df$Presence == 0 (возможно иметь строки с несколькими df$Presence == 1 в одной группе, например, Фред был на Station4, Station9 и Station 15 2016-01-06). Но если в группе нет строк с df$Presence == 1, не удаляйте ни одну из строк (поэтому я не могу просто удалить все df$Presence == 0 строки).

Таким образом, указанная группа станет:

 Date         ID      Station    Presence
 <date>       <fct>   <fct>      <dbl>
 2016-01-03   Fred    Station4   1

Однако следующая группа останется такой, как есть (поскольку в группе нет Presence == 1):

filter(df, Date== "2016-01-03" & ID == "Mark")
 Date       ID    Station    Presence
 <date>     <fct> <fct>      <dbl>
 2016-01-03 Mark Station1    0 
 2016-01-03 Mark Station2    0 
 2016-01-03 Mark Station3    0 
 2016-01-03 Mark Station4    0
 2016-01-03 Mark Station5    0 
 2016-01-03 Mark Station6    0 
 2016-01-03 Mark Station7    0 
 2016-01-03 Mark Station8    0 
 2016-01-03 Mark Station9    0 
 2016-01-03 Mark Station10   0 
 2016-01-03 Mark Station11   0 
 2016-01-03 Mark Station12   0 
 2016-01-03 Mark Station13   0 
 2016-01-03 Mark Station14   0 
 2016-01-03 Mark Station15   0 
 2016-01-03 Mark Station16   0 
 2016-01-03 Mark Station17   0 
 2016-01-03 Mark Station18   0 

Я думал начать с

df %>%
  group_by(Date, ID) %>%

Однако я не знаю, как действовать дальше. Я не знаю, как бороться с контрастными условиями.

1 Ответ

0 голосов
/ 02 июля 2018
library(tidyverse)
dat%>%
   group_by(Date,ID)%>%
   filter(all(Presence==0)|Presence==1)

# A tibble: 19 x 4
# Groups:   Date, ID [2]
   Date       ID    Station   Presence
   <chr>      <chr> <chr>        <int>
 1 2016-01-03 Fred  Station4         1
 2 2016-01-03 Mark  Station1         0
 3 2016-01-03 Mark  Station2         0
 4 2016-01-03 Mark  Station3         0
 5 2016-01-03 Mark  Station4         0
 6 2016-01-03 Mark  Station5         0
 7 2016-01-03 Mark  Station6         0
 8 2016-01-03 Mark  Station7         0
 9 2016-01-03 Mark  Station8         0
10 2016-01-03 Mark  Station9         0
11 2016-01-03 Mark  Station10        0
12 2016-01-03 Mark  Station11        0
13 2016-01-03 Mark  Station12        0
14 2016-01-03 Mark  Station13        0
15 2016-01-03 Mark  Station14        0
16 2016-01-03 Mark  Station15        0
17 2016-01-03 Mark  Station16        0
18 2016-01-03 Mark  Station17        0
19 2016-01-03 Mark  Station18        0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...