R 函数检查是否存在日期减1的相同行

R 函数检查是否存在日期减1的相同行,r,dplyr,R,Dplyr,我需要一个函数来检查我的数据框中是否有其他相同的行,但日期减1,如果存在,则返回true。这是一个大数据帧,所以我希望尽可能高效地完成它 例如,以以下数据帧为例: name |date Timmy |01/Jan/2016 Timmy |02/Jan/2016 Timmy |03/Jan/2016 Sally |04/Jan/2016 Johnny|13/Feb/2016 Johnny|29/Mar/2016 该函数应查看Timmy | 02/Jan/2016,检查Timmy

我需要一个函数来检查我的数据框中是否有其他相同的行,但日期减1,如果存在,则返回
true
。这是一个大数据帧,所以我希望尽可能高效地完成它

例如,以以下数据帧为例:

name  |date       
Timmy |01/Jan/2016
Timmy |02/Jan/2016
Timmy |03/Jan/2016
Sally |04/Jan/2016
Johnny|13/Feb/2016
Johnny|29/Mar/2016
该函数应查看
Timmy | 02/Jan/2016
,检查
Timmy | 01/Jan/2016
是否存在,并返回
true
。生成的数据帧如下所示:

name  |date       |hasDateMinusOne
Timmy |01/Jan/2016|false
Timmy |02/Jan/2016|true
Timmy |03/Jan/2016|true
Sally |04/Jan/2016|false
Johnny|13/Feb/2016|false
Johnny|29/Mar/2016|false
虽然哈德利回答了这个问题,但它已经5岁了,比dplyr早。我想知道这是否仍然是处理1000000多行的最有效方法

谢谢


肖恩

如果将日期格式化为日期,则只需减去一个:

library(dplyr)

df %>% group_by(name) %>% 
    mutate(date = as.Date(date, '%d/%b/%Y'), 
           hasDateMinusOne = (date - 1) %in% date)

# Source: local data frame [6 x 3]
# Groups: name [3]
# 
#     name       date hasDateMinusOne
#   (fctr)     (date)           (lgl)
# 1  Timmy 2016-01-01           FALSE
# 2  Timmy 2016-01-02            TRUE
# 3  Timmy 2016-01-03            TRUE
# 4  Sally 2016-01-04           FALSE
# 5 Johnny 2016-02-13           FALSE
# 6 Johnny 2016-03-29           FALSE

我们只能使用
base R
来实现这一点。使用
transform
将“date”类转换为“date”类,然后使用
ave
按“name”分组,并在%的“date”列中查找前一天是否为
%

df <- transform(df, date = as.Date(date, "%d/%b/%Y"))
df$hasDateMinusOne <- with(df, !!ave(as.integer(date), name,
            FUN = function(x) (x-1) %in% x))
setDT(df)[, date := as.Date(date, '%d/%b/%Y') 
     ][, hasDateMinusOne := (date-1) %in% date, by =  name]
df
#     name       date hasDateMinusOne
#1:  Timmy 2016-01-01           FALSE
#2:  Timmy 2016-01-02            TRUE
#3:  Timmy 2016-01-03            TRUE
#4:  Sally 2016-01-04           FALSE
#5: Johnny 2016-02-13           FALSE
#6: Johnny 2016-03-29           FALSE