【问题标题】:Delete observations with specific row order删除具有特定行顺序的观察
【发布时间】:2020-03-10 02:00:36
【问题描述】:

我有一个来自游戏的基于活动的数据集,我想在游戏会话中汇总它。在某些情况下,我观​​察到游戏恢复后直接是游戏开始或游戏结束。由于这些不是有意义的游戏会话,因此我想从我的数据集中删除这些观察结果(每场比赛恢复后 a)比赛开始或 b)比赛结束。

简化示例数据:

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

【问题讨论】:

    标签: r performance transform dplyr


    【解决方案1】:

    您可以使用leadlag 来过滤行:

    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
    

    data.tableshift 中使用的类似逻辑

    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'))]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多