R 另一列中每个唯一值的两个日期之间的差异

R 另一列中每个唯一值的两个日期之间的差异,r,R,我有客户ID的数据以及与客户交互的日期。我想创建一个新的变量,显示客户在几天内接触的时间 Customer ID | Date of Contact 211 2015-02-24 211 2015-06-17 211 2015-08-11 202 2015-01-02 202

我有客户ID的数据以及与客户交互的日期。我想创建一个新的变量,显示客户在几天内接触的时间

  Customer ID | Date of Contact
       211         2015-02-24          
       211         2015-06-17          
       211         2015-08-11          
       202         2015-01-02          
       202         2014-06-19          
       194         2015-07-28      
这个想法是,对于每个客户,新变量应该计算他最近的交互和最老的交互之间的天数。例如,在客户ID为211的客户中,它将是2015-08-11和2015-02-24之间的天数(168天)

如果与客户只有一次交互,则天数应为0(与客户ID 194的情况相同)


谢谢你的帮助

有几种方法可以进行“分组”计算。我喜欢
data.table
;它还擅长准备数据

R> suppressMessages(library(data.table))
R> dt <- data.table::fread("id  Date
+ 211         2015-02-24          
+ 211         2015-06-17          
+ 211         2015-08-11          
+ 202         2015-01-02          
+ 202         2014-06-19          
+ 194         2015-07-28")
R> dt[, Date:=as.IDate(Date)]                     ## make sure it is 'Date' type
R> dt[, .(duration=max(Date)-min(Date)), by=id]
    id duration
1: 211      168
2: 202      197
3: 194        0
R> 
R>suppressMessages(库(data.table))
R> dt dt[,Date:=as.IDate(Date)]##确保它是“Date”类型
R> dt[,(持续时间=最大(日期)-最小(日期)),by=id]
id持续时间
1: 211      168
2: 202      197
3: 194        0
R>

这里的关键是给定id,计算实际上只是日期的“范围”,即最大值减去最小值。

您可以使用
dplyr::summary

df %>%
    group_by(Customer_ID) %>%
    summarise(diff = max(Date_of_Contact) - min(Date_of_Contact))
#  Customer_ID diff
#        <int> <time>
#1         194 0
#2         202 197
#3         211 168
df%>%
分组依据(客户ID)%>%
总结(差异=最大(联系日期)-最小(联系日期))
#客户ID差异
#         
#1         194 0
#2         202 197
#3         211 168

样本数据
require(tidyverse);

df使用base R,您可以做到这一点

df$Diff <- as.integer(ave(as.character(df$Date_of_Contact), df$Customer_ID, FUN = function(d) as.Date(d) - as.Date(d[1])))
df
#  Customer_ID Date_of_Contact Diff
#1         211      2015-02-24    0
#2         211      2015-06-17  113
#3         211      2015-08-11  168
#4         202      2015-01-02    0
#5         202      2014-06-19 -197
#6         194      2015-07-28    0
df$Diff <- as.integer(ave(as.character(df$Date_of_Contact), df$Customer_ID, FUN = function(d) as.Date(d) - as.Date(d[1])))
df
#  Customer_ID Date_of_Contact Diff
#1         211      2015-02-24    0
#2         211      2015-06-17  113
#3         211      2015-08-11  168
#4         202      2015-01-02    0
#5         202      2014-06-19 -197
#6         194      2015-07-28    0
tapply(df$Date_of_Contact, df$Customer_ID, FUN = function(d) d[length(d)] - d[1])
# 194  202  211 
#   0 -197  168