我有一些看起来像这样的数据:
head(data1[,1:5])
eid created class_id min.e.event_time. lead_date
2610966 284546 2015-03-19 11:21:17 36 2015-03-19 11:21:17 NULL
2610972 284554 2015-03-19 12:37:19 36 2015-03-19 12:37:19 NULL
2610973 284554 2015-03-19 12:37:19 36 2015-03-19 12:37:19 NULL
2610975 284558 2015-03-19 14:18:43 36 2015-03-19 14:18:43 NULL
2610976 284558 2015-03-19 14:18:43 36 2015-03-19 14:18:43 NULL
2610977 284558 2015-03-19 14:18:43 36 2015-03-19 14:18:43 NULL
这是一个事件表,eid是一个用户ID。每一行都是遇到事件的用户的实例。
我想了解每个用户的事件数量:
eid_email <- aggregate(data1$eid, list(data1$eid), function(x) length(x))
这似乎有效。大。
但我需要添加一个条件。我需要为每个用户计算事件,如上所述,仅在event_time小于lead_date的情况下。
当我输入help(aggregate)时,手册说有一个可以与aggregate()一起使用的子集参数。我可以这样使用这个论点吗?
如何将条件应用于我的聚合函数?如果那不可能是另一种方式吗?
**评论后的STR数据**
str(data1)
'data.frame': 1906721 obs. of 10 variables:
$ eid : int 45 45 45 45 45 45 45 45 45 45 ...
$ created : Factor w/ 36204 levels "0000-00-00 00:00:00",..: 1 1 1 1 1 1 1 1 1 1 ...
$ class_id : int 36 36 36 36 36 36 36 36 36 36 ...
$ min.e.event_time.: Factor w/ 16175 levels "2013-04-15 11:17:19",..: 10025 10025 10025 10025 10025 10025 10025 10025 10025 10025 ...
$ lead_date : Factor w/ 11199 levels "2012-10-11 18:39:12",..: 11199 11199 11199 11199 11199 11199 11199 11199 11199 11199 ...
$ camp : int 98713 59020 75796 99195 76986 57986 54062 80420 55078 70800 ...
$ event_date : Factor w/ 695747 levels "2008-01-18 12:18:01",..: 71975 27451 45235 72491 48792 24606 20021 52261 32169 57764 ...
$ event : Factor w/ 3 levels "click","open",..: 3 3 3 3 3 1 3 2 2 3 ...
$ message_name : Factor w/ 2707 levels ""," 2015-03 CAD Promotion Update",..: 1570 2624 1970 1881 1973 1931 1919 1983 2391 2045 ...
$ subject_lin : Factor w/ 2043 levels ""," Christie Office Holiday Hours",..: 311 952 318 309 495 1450 520 298 1333 750 ...
答案 0 :(得分:1)
如果安装了dplyr,则可以执行以下操作:
library(dplyr)
data2 <- data1 %>%
mutate( event_time_POSIX = as.POSIXct(min.e.event_time.,
format="%Y-%m-%d %H:%M:%S",
origin="1970-01-01")) %>%
mutate( lead_time_POSIX = as.POSIXct(lead_date,
format="%Y-%m-%d %H:%M:%S",
origin="1970-01-01")) %>%
filter( event_time_POSIX < lead_time_POSIX ) %>%
group_by(eid) %>%
summarize( n=n() )
options(dplyr.width=Inf)
print(data2)