在聚合函数中添加一个 where 条件
Add a where condition inside of aggregate function
我有一些数据如下所示:
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
这是一个事件table,eid 是一个用户 ID。每行都是该用户经历事件的一个实例。
我想要每个用户的事件数:
eid_email <- aggregate(data1$eid, list(data1$eid), function(x) length(x))
这似乎有效。太好了。
但我需要添加一个条件。我需要像上面一样为每个用户计算事件,只有 event_time 小于 lead_date.
当我键入 help(aggregate) 时,手册说有一个子集参数可以与 aggregate() 一起使用。我可以这样使用这个参数吗?
如何将条件应用于聚合函数?如果那不可能,他们还有别的办法吗?
** 评论后的 STR 数据 1 **
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 ...
如果您安装了 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)
我有一些数据如下所示:
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
这是一个事件table,eid 是一个用户 ID。每行都是该用户经历事件的一个实例。
我想要每个用户的事件数:
eid_email <- aggregate(data1$eid, list(data1$eid), function(x) length(x))
这似乎有效。太好了。
但我需要添加一个条件。我需要像上面一样为每个用户计算事件,只有 event_time 小于 lead_date.
当我键入 help(aggregate) 时,手册说有一个子集参数可以与 aggregate() 一起使用。我可以这样使用这个参数吗?
如何将条件应用于聚合函数?如果那不可能,他们还有别的办法吗?
** 评论后的 STR 数据 1 **
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 ...
如果您安装了 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)