Удалить наблюдения с указанным c порядком строк - PullRequest
0 голосов
/ 10 марта 2020

У меня есть набор данных на основе активности из игры, и я хочу объединить его в игровых сессиях. В некоторых случаях я наблюдаю за возобновлением игры непосредственно после начала игры или закрытия игры. Поскольку это не имеет смысла игровой сеанс, я хочу удалить эти наблюдения (каждое резюме игры, за которым следует а) начало игры или б) закрытие игры) из моего набора данных.

Упрощенные примеры данных:

game_da = data.frame(activity = c("gamestart", "activity1", "activity2", "gameclose", "gameresume", "gameclose", "gameresume", "activity1", "gameclose"))
game_da
    activity
1  gamestart
2  activity1
3  activity2
4  gameclose
5 gameresume
6  gameclose
7 gameresume
8  activity1
9  gameclose 

Ожидаемый результат:

game_da2 = data.frame(activity = c("gamestart", "activity1", "activity2", "gameclose", "gameresume", "activity1", "gameclose"))
game_da2
    activity
1  gamestart
2  activity1
3  activity2
4  gameclose
5 gameresume
6  activity1
7  gameclose

То, что я пробовал (... но удаляет другие наблюдения, которые я хочу):

game_da3 = mutate(game_da, help_var = case_when(  activity == "gameresume" |
+                                                   activity == "gamestart" |
+                                                   activity == "gameclose" ~ 1, TRUE ~ 0),
+                   lead_help_var = lead(help_var),
+                   diff_help_var = help_var + lead_help_var) %>%
+   filter(diff_help_var != 2)
game_da3
    activity help_var lead_help_var diff_help_var
1  gamestart        1             0             1
2  activity1        0             0             0
3  activity2        0             1             1
4 gameresume        1             0             1
5  activity1        0             1             1

1 Ответ

1 голос
/ 10 марта 2020

Вы можете использовать lead и lag для фильтрации строк:

library(dplyr)

game_da %>%
   filter(!(activity == 'gameresume' & 
            lead(activity, default = TRUE) %in% c('gameclose', 'gamestart') | 
            lag(activity, default = TRUE) == 'gameresume' & 
            activity %in% c('gameclose', 'gamestart')))

#    activity
#1  gamestart
#2  activity1
#3  activity2
#4  gameclose
#5 gameresume
#6  activity1
#7  gameclose

Аналогичные логики c с использованием в data.table с shift

library(data.table)
setDT(game_da)[! (activity == 'gameresume' & 
   shift(activity, type = 'lead', fill = TRUE) %in% c('gameclose', 'gamestart') | 
   shift(activity, fill = TRUE) == 'gameresume' & 
         activity %in% c('gameclose', 'gamestart'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...