如何根据r中的日期删除行?
如果两行之间的日期超过30天,我想删除这些行。我不知道如何解决这个问题,所以希望有人能帮助我 我的数据如下所示:如何根据r中的日期删除行?,r,date,delete-row,R,Date,Delete Row,如果两行之间的日期超过30天,我想删除这些行。我不知道如何解决这个问题,所以希望有人能帮助我 我的数据如下所示: Sessionid Clientid Date (D-M-Y) Conversion 1 1 01-01-2020 No 2 1 02-01-2020 No
Sessionid Clientid Date (D-M-Y) Conversion
1 1 01-01-2020 No
2 1 02-01-2020 No
3 1 03-01-2020 No
4 1 15-02-2020 No
5 1 16-02-2020 No
6 1 17-02-2020 Yes
7 2 01-01-2020 No
8 2 02-01-2020 Yes
所以在这个例子中,我想删除前三行,因为在客户端1的会话3和会话4之间,已经30天没有交互了。因此,我的输出必须如下所示:
Sessionid Clientid Date (D-M-Y) Conversion
4 1 15-02-2020 No
5 1 16-02-2020 No
6 1 17-02-2020 Yes
7 2 01-01-2020 No
8 2 02-01-2020 Yes
因此,对于每一次转换,我想检查之前的所有会话,以及每一个会话,如果它们在30天内。因此,即使客户有5个会话,但每个会话之间的间隔为28天也可以
谢谢你的帮助 一个基本策略是:
split()
lappy()
do.callrbind()
,但还有其他可能的选项
df当所有会话间隔28天时会发生什么?所以第一节课在第二节课的30天内,第二节课在第三节课的30天内,等等。。。除了第三节课,他们是否都应该被移除?不,如果这两节课在30天内,他们可以继续。我只需要控制一个事实,即客户在30天内没有互动。所以,即使是一个有5个疗程的客户,都有28天的差异,也可以在30天内保持什么?客户端的最后一个会话?因为Sessionid 2在Sessionid 3的30天内..是的,但我想从客户进行转换的角度检查它。因此,在会话6中,客户机转换。第5课时可以在第6课时后的30天内继续上课。第4课时可以继续,因为它在第5课时的30天内。第三课时必须结束,因为它不是在第四课时的30天内。因为会话3需要删除,所以之前的所有其他会话也需要删除(所以1和2)。很抱歉给你带来了混乱
df <- data.frame(
Sessionid = 1:13,
Clientid = c(rep(1, 6), 2, 2, rep(3, 4), 4),
Date = as.Date(c("01-01-2020", "02-01-2020", "03-01-2020", "15-02-2020",
"16-02-2020", "17-02-2020", "01-01-2020", "02-01-2020",
"01-05-2020", "15-06-2020", "01-08-2020", "02-08-2020",
"02-03-2020"),
"%d-%m-%y"),
Conversion = c(rep("No", 5), "Yes", "No", "Yes", "No", "Yes", "No", "Yes", "No")
) # expanded toy data set meant to demonstrate cases with multiple / no conversions
df
# Sessionid Clientid Date Conversion
# 1 1 1 2020-01-01 No
# 2 2 1 2020-01-02 No
# 3 3 1 2020-01-03 No
# 4 4 1 2020-02-15 No
# 5 5 1 2020-02-16 No
# 6 6 1 2020-02-17 Yes
# 7 7 2 2020-01-01 No
# 8 8 2 2020-01-02 Yes
# 9 9 3 2020-05-01 No
# 10 10 3 2020-06-15 Yes
# 11 11 3 2020-08-01 No
# 12 12 3 2020-08-02 Yes
# 13 13 4 2020-03-02 No
step1 <- split(df, df$Clientid)
# break df into a list of data frames according to Clientid
step2 <- lapply(step1, function(x) {
daterange <- x[x$Conversion == "Yes", ]$Date
# record set of successful conversion dates
daterange <- unlist(lapply(daterange, function(y) seq(y-30, y+30, by = "days")))
# puff out set of days by 30 days in either direction from each conversion
x[x$Date %in% daterange, ]
# subset each data frame by keeping only those with a date in the range
})
df2 <- do.call("rbind", step2)
# glue the list of data frames back together
row.names(df2) <- NULL
# remove junk artifact row names
df2
# Sessionid Clientid Date Conversion
# 1 4 1 2020-02-15 No
# 2 5 1 2020-02-16 No
# 3 6 1 2020-02-17 Yes
# 4 7 2 2020-01-01 No
# 5 8 2 2020-01-02 Yes
# 6 10 3 2020-06-15 Yes
# 7 11 3 2020-08-01 No
# 8 12 3 2020-08-02 Yes