首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的条件分组

R中的条件分组
EN

Stack Overflow用户
提问于 2019-06-23 10:39:58
回答 1查看 107关注 0票数 0

我正在寻找指南来解决R中的一个场景,其中我有一个customer_ID和date_mailed的列表。customer_ID是每个客户的唯一ID,date_mailed包含向这些客户发送邮件的日期。我希望得到一个由customer_ID发送的邮件数量的组计数,其中每组将是邮件发送间隔不到90天。示例数据集:

对于customer_ID 123,2/28和6/1之间的差异是93天,所以它是两组。以下是所需的输出:为了清楚起见,即使Customer_ID 123是相同的,但是第4行123和第3行123之间的间隔超过90天,我希望将前三个123分组在一起,并将下两个123分组在一起。

EN

回答 1

Stack Overflow用户

发布于 2019-06-23 15:36:56

另一种选择:

代码语言:javascript
复制
library(dplyr)

df %>%
  mutate(Date_Mailed = as.Date(Date_Mailed, "%m/%d/%Y")) %>%
  count(
    Customer_ID, 
    grp = cumsum(c(0, +(Date_Mailed > (lag(Date_Mailed) + 90))[-1])),
    name = 'Group_Mail_Count'
  ) %>%
  select(-grp)

输出:

代码语言:javascript
复制
  Customer_ID Group_Mail_Count
        <dbl>            <int>
1         123                3
2         123                2
3         456                3
4         890                1
5         890                2

或使用data.table

代码语言:javascript
复制
library(data.table)

setDT(df)[, Date_Mailed := as.Date(Date_Mailed, "%m/%d/%Y")][
  , .(Group_Mail_Count = .N), by = .(Customer_ID, 
                                    cumsum(c(0, +(Date_Mailed > (lag(Date_Mailed) + 90))[-1])))
][, 'cumsum' := NULL]

输出:

代码语言:javascript
复制
   Customer_ID Group_Mail_Count
1:         123                3
2:         123                2
3:         456                3
4:         890                1
5:         890                2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56720618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档