在聚合函数内添加where条件

时间:2015-03-20 20:14:25

标签: r conditional-statements aggregate

我有一些看起来像这样的数据:

 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 ...

1 个答案:

答案 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)