R 另一列中每个唯一值的两个日期之间的差异
我有客户ID的数据以及与客户交互的日期。我想创建一个新的变量,显示客户在几天内接触的时间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
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