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

时间:2018-02-18 21:17:36

标签: r

我的数据包含客户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的情况一样)

感谢您的帮助!

3 个答案:

答案 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