我有以下数据集:
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。]
答案 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