2

我有一个包含数千行的数据框,但下面给出了一个示例:

     userid     event
1     123        view
2     123        view
3     123       order
4     345        view
5     345        view
6     345        view
7     345       order
8     111        view
9     111       order
10    111        view
11    111        view
12    111        view
13    333        view
14    333        view
15    333        view

输入(数据)

structure(list(userid = c(123, 123, 123, 345, 345, 345, 345, 
111, 111, 111, 111, 111, 333, 333, 333), eventaction = structure(c(2L, 
2L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("order", 
"view"), class = "factor")), .Names = c("userid", "event"
), row.names = c(NA, -15L), class = "data.frame")

我正在做的是提取所有包含事件下“订单”一词的用户标识行。结果将包含 userid 的所有行,不包括 userid = 333,因为 eventaction 不包含订单条目。

第二个任务是在输入订单之前计算“查看”的出现次数。我将不胜感激帮助和指点。

谢谢。

4

4 回答 4

3

我们可以尝试使用data.table. 将'data.frame'转换为'data.table'(setDT(data)),按'userid'分组,'userid'中ifany'event'是'order',返回Data.table'的子集(.SD

library(data.table)
setDT(data)[,if(any(event=="order")) .SD , by = userid]

或者使用dplyr,我们在按“用户ID”分组后的“事件”中filterany“订单”。

library(dplyr)
data %>%
    group_by(userid) %>%
    filter(any(event == "order"))
于 2016-09-14T15:12:56.330 回答
1

在可能有多个订单的情况下执行您的第二项任务 a userid

library(dplyr)
df %>% group_by(userid) %>% 
       mutate(row_num = row_number()) %>% 
       filter(event=="order") %>% 
       mutate(num_views_before=c(first(row_num),diff(row_num))-1)

笔记:

  1. 我们group_by userid
  2. 我们添加一列来跟踪组的行。
  3. 我们只保留那些带有“顺序”的行。
  4. diff我们使用预先创建的行号计算每个订单之前的视图数量。

为了测试,我修改了您的数据以将第 12 行中的事件更改为“订单”,以便userid=111有两个订单。

修改数据:

structure(list(userid = c(123, 123, 123, 345, 345, 345, 345, 
111, 111, 111, 111, 111, 333, 333, 333), event = structure(c(2L, 
2L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L), .Label = c("order", 
"view"), class = "factor")), .Names = c("userid", "event"), row.names = c(NA, 
-15L), class = "data.frame")
##   userid event
##1     123  view
##2     123  view
##3     123 order
##4     345  view
##5     345  view
##6     345  view
##7     345 order
##8     111  view
##9     111 order
##10    111  view
##11    111  view
##12    111 order
##13    333  view
##14    333  view
##15    333  view

有了这些数据,我们得到:

##Source: local data frame [4 x 4]
##Groups: userid [3]
##
##  userid  event row_num num_views_before
##   <dbl> <fctr>   <int>            <dbl>
##1    123  order       3                2
##2    345  order       4                3
##3    111  order       2                1
##4    111  order       5                2
于 2016-09-14T15:35:41.837 回答
0

使用标准R,如果您调用mydatdata.frame:

myusers <- mydat[mydat$event == "order", "userid"]
mydat[mydat$userid %in% myusers,]
于 2016-09-14T15:26:24.903 回答
0

你可以这样做:

df[df$userid %in% df[df$event=="order",]$userid,]

或与subset

subset(df, df$userid %in% subset(df, event=="order")$userid)

match功能:

subset(df, match(df$userid, subset(df, event=="order")$userid, nomatch = 0)>0)

或使用sqldf库:

library(sqldf)
sqldf("select * from df where df.userid in (select df.userid from df where df.event=='order')")

   # userid event
# 1     123  view
# 2     123  view
# 3     123 order
# 4     345  view
# 5     345  view
# 6     345  view
# 7     345 order
# 8     111  view
# 9     111 order
# 10    111  view
# 11    111  view
# 12    111  view
于 2016-09-14T15:29:19.603 回答