我的数据包含客户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的情况一样)
感谢您的帮助!
答案 0 :(得分:1)
有几种方法可以做到"分组"计算。我喜欢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>
这里的关键是,给定id,计算实际上只是&#34;范围&#34;日期,即最大减去分钟
答案 1 :(得分:0)
您可以使用dplyr::summarise
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
require(tidyverse);
df <- read_table(
"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")
答案 2 :(得分:0)
使用基础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
或者,如果您只想要第一个和最后一个日期之间的差异,
tapply(df$Date_of_Contact, df$Customer_ID, FUN = function(d) d[length(d)] - d[1])
# 194 202 211
# 0 -197 168