R中的条件分组

时间:2019-06-23 02:39:57

标签: r

我正在寻找解决R中的方案的指南,该方案中有一个customer_ID和date_mailed的列表。 customer_ID是每个客户的唯一ID,date_mailed包含向这些客户发送邮件的日期。我正在寻找由customer_ID发送的邮件数量的组计数,其中每个组将是相隔少于90天发送的邮件。示例数据集:

Example Dataset customer_ID 123的2/28和6/1之间的差异为93天,因此将其划分为2个组。这是所需的输出: 需要说明的是,即使Customer_ID 123相同,但第四行123和第三行123之间的间隔超过90天,我希望将前三个123组合在一起,然后将后两个123组合在一起。

Expected Output

1 个答案:

答案 0 :(得分:1)

另一个选择:

[('a', 'b'), ('a', 'c'), ('b', 'c')]
[('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '4'), ('3', '5'), ('4', '5')]

输出:

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)

或使用 Customer_ID Group_Mail_Count <dbl> <int> 1 123 3 2 123 2 3 456 3 4 890 1 5 890 2

data.table

输出:

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]