R 函数检查是否存在日期减1的相同行
我需要一个函数来检查我的数据框中是否有其他相同的行,但日期减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
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