Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据r中的日期删除行?_R_Date_Delete Row - Fatal编程技术网

如何根据r中的日期删除行?

如何根据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

如果两行之间的日期超过30天,我想删除这些行。我不知道如何解决这个问题,所以希望有人能帮助我

我的数据如下所示:

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.call
    rbind()
    ,但还有其他可能的选项
  • 以下是正在实施的策略(这是一个重写版本,可以正确处理每个客户有多个转换的情况,因为我不知道这对您是否重要):


    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