在R中grepl后过滤数据集?

时间:2016-06-20 10:37:34

标签: r dplyr

我有以下数据集:

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

我只想采用之前的“订单”,即用户A的“订单/付款”和用户B的“订单/客户登录”。

话虽如此,所有其他非秩序事件应该保持不变。

因此,输出数据集将是:

USERNAME API_TRACK_EVENT         TIME
userA    Viewed pic              1454941960
userA    Order/payment           1454941972
userB    Viewed pic              1454941983
userB    Order/guestlogin        1454941986

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

2 个答案:

答案 0 :(得分:3)

这里是基础R的选项:

0)根据USERNAME和TIME订购数据:

df <- df[order(df$USERNAME, df$TIME),]

a)检查行是否包含订单信息:

idx <- grepl("Order", df$API_TRACK_EVENT, ignore.case = TRUE)

b)按USERNAME组的子集

subset(df, ave(idx, USERNAME, FUN = cumsum) <= 1L | !idx)

#  USERNAME  API_TRACK_EVENT       TIME
#1    userA       Viewed_pic 1454941960
#2    userA    Order/payment 1454941972
#4    userB       Viewed_pic 1454941983
#5    userB Order/guestlogin 1454941986

此子集仅设置第一个订单行和任何其他行(没有订单信息)。

答案 1 :(得分:2)

我们可以使用slice/which.max/grep过滤掉dplyr中的行。在按“USERNAME”分组后,我们得到一个带有grepl的逻辑索引,用which.max包装以获取第一个TRUE值的数字索引,使用seq从{获取序列{1}}和1:index它可以对行进行子集化。此方法假定“Order”元素在每个“USERNAME”的末尾出现,如示例中所示。

slice

但是,如果未对“Order”元素进行排序,我们可以使用library(dplyr) df1 %>% arrange(USERNAME, TIME) %>% group_by(USERNAME) %>% slice(seq(which.max(grepl("Order", API_TRACK_EVENT)))) # 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 duplicated来保留具有任何元素的行,这些元素没有“Order”或只有第一个“Order” '元素。

grepl

注意:使用@docendodiscimus

的贡献进行编辑

或使用第一种方法df1 %>% arrange(USERNAME, TIME) %>% group_by(USERNAME) %>% filter( {idx = grepl("^Order", API_TRACK_EVENT); !duplicated(idx)|!idx}) # 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

data.table