【问题标题】:Ordering and filtering(delete) the rows after a grepl in R?在R中的grepl之后排序和过滤(删除)行?
【发布时间】:2016-06-20 12:09:43
【问题描述】:

我有以下数据集:

USERNAME API_TRACK_EVENT         TIME
userA    Viewed pic              1454941960
userA    Order/payment           1454941972
userA    Edit pic                1454941973
userA    Order/Changed Address   1454941976
userB    Viewed pic              1454941983
userB    Order/guestlogin        1454941986
userB    Order/Changed Address   1454941992

我想对数据集执行以下操作:

  • 按照TIME 对数据集进行排序
  • 在“订单”事件第一次发生后删除所有APITRACK_EVENTs(目标是在第一次下订单之前获取用户的所有api跟踪事件)。

那么,我应该怎么做呢? [也开放使用 dplyr。]


A (somewhat)related post

【问题讨论】:

  • 你尝试了什么?为什么它不起作用?
  • @Heroka 在链接的帖子中,您可以注意到我试图让 df 订购 w.r.t TIME,然后过滤掉非第一个“订单”出现。但是,无法完成 Delete all the APITRACK_EVENTs after the first occurrence of an "Order" event 部分。
  • @akrun 不。我需要在第一次发生“订单”事件后删除所有 API_TRACKING 事件,而不仅仅是删除非第一个“订单”发生。

标签: r dplyr


【解决方案1】:

在我们arrange by 'USERNAME', 'TIME' 并按 'USERNAME' 分组后,我们使用 greplwhich.max 来索引第一次出现的 'Order'。向它添加 1 并从它获取序列 (:) 到 nrow (n())。由于我们需要从数据集中删除这些行,我们可以使用setdiff 找到不在创建索引中的行索引,并使用slice 找到它。

library(dplyr)
df1 %>% 
  arrange(USERNAME, TIME) %>%
  group_by(USERNAME) %>%
  slice(setdiff(row_number(), (which.max(grepl("Order", 
                                API_TRACK_EVENT))+1): n()))    
#   USERNAME  API_TRACK_EVENT       TIME    
#      <chr>            <chr>      <int>
#1    userA       Viewed pic 1454941960
#2    userA    Order/payment 1454941972
#3    userB       Viewed pic 1454941983
#4    userB Order/guestlogin 1454941986

另一个选项是filter

df1 %>%
   arrange(USERNAME, TIME) %>% 
   group_by(USERNAME) %>% 
   filter(!lag(cumsum(grepl("Order", API_TRACK_EVENT)), default = 0))
#   USERNAME  API_TRACK_EVENT       TIME
#     <chr>            <chr>      <int>
#1    userA       Viewed pic 1454941960
#2    userA    Order/payment 1454941972
#3    userB       Viewed pic 1454941983
#4    userB Order/guestlogin 1454941986

【讨论】:

  • 感谢您的回答。你能解释一下最后一行吗(slice ..一个):)
  • @Dawny33 添加了一些解释。
  • 非常感谢。让我开心:)
猜你喜欢
  • 1970-01-01
  • 2023-01-16
  • 2021-12-23
  • 2021-12-07
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2021-12-08
  • 2021-02-21
相关资源
最近更新 更多