【问题标题】:Add a where condition inside of aggregate function在聚合函数中添加 where 条件
【发布时间】:2015-03-21 05:07:50
【问题描述】:

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

 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 data1 跟随评论 **

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

【问题讨论】:

  • 您能为您的数据框提供dput 吗?
  • 如果您使用 with 和聚合的子集 outside,这可能会更容易:with(mtcars, aggregate(mpg, list(gear), length)); with(mtcars[mtcars$mpg &lt; 30, ], aggregate(mpg, list(gear), length))
  • 感谢您的评论。我试过这个: with(data1[data1$created

标签: r conditional-statements aggregate


【解决方案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)

【讨论】:

  • 我打错了吗:data1 %>% + filter(min.e.event_time. % + group_by(eid) %>% + summarise(n = n())来源:本地数据帧 [0 x 2] 未显示变量:eid (int), n (int) 警告消息:在 Ops.factor(c(10025L, 10025L, 10025L, 10025L, 10025L, 10025L, : '
  • 看起来您的lead_date 列的类型不正确。你能告诉我们str(data1)
  • 已添加。此外,正确 - lead_date 可以是日期或 NULL。那会改变什么?
  • 顺便说一下,我的示例假设不应该计算缺少lead_dates (NA) 的记录,因为无法确定event_time 小于lead_date。
  • 太棒了!出于显示目的,结果可能缩短了print。这就是需要options(dplyr.width=Inf) 的原因。
猜你喜欢
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多