首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >另一列中每个唯一值的两个日期之间的差异

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

Stack Overflow用户
提问于 2018-02-19 05:17:36
回答 3查看 114关注 0票数 0

我有客户I和与客户交互的日期的数据。我想创建一个新变量,用于显示客户在几天内联系了多长时间

代码语言:javascript
复制
  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的情况相同)

谢谢你的帮助!

EN

回答 3

Stack Overflow用户

发布于 2018-02-19 05:23:57

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

代码语言:javascript
复制
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,计算实际上就是日期的“范围”,即max减去min。

票数 1
EN

Stack Overflow用户

发布于 2018-02-19 05:24:41

您可以使用dplyr::summarise

代码语言:javascript
复制
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

样本数据

代码语言:javascript
复制
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")
票数 0
EN

Stack Overflow用户

发布于 2018-02-19 05:33:37

使用base R可以做到这一点。

代码语言:javascript
复制
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

或者,如果你只想要第一个日期和最后一个日期之间的差异,

代码语言:javascript
复制
tapply(df$Date_of_Contact, df$Customer_ID, FUN = function(d) d[length(d)] - d[1])
# 194  202  211 
#   0 -197  168
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48856685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档