R dplyr-检查前一行的difftime

时间:2019-06-12 09:25:08

标签: r dplyr

我的数据框如下:

   dataframe <- read.table(text="
     id    send             paid
     1     2013-01-25       NA
     2     2013-02-21       2013-02-23
     2     2013-02-21       2013-02-25
     2     2013-02-21       2013-02-28
     3     2013-03-01       2013-03-02
     3     2013-03-01       2013-03-03
     4     2013-06-23       2013-05-03
    ", header=TRUE)

我想做的是为每个dplyrid中创建新的列结果,该列结果的行数要高于实际id和{{1}的send发送之间的差} paid上方的日期少于120天。

换句话说,id 1上面没有行,因此结果将为0,id 2的result应该为0,因为上面的值为idNA 3的结果为3,因为id与(2013-03-012013-02-232013-02-25)之间的差小于120天。 2013-02-28 4的结果应该为4,因为id之间的日期差小于120天(2013-06-232013-03-032013-03-022013-02-28 )。

2013-02-25

1 个答案:

答案 0 :(得分:0)

使用dplyr包可以做到这一点:

w.get()

说明:第一步,定义一个函数,该函数对小于给定索引(小于120天)的索引行进行计数。 第二步,使用步骤1的功能将library(dplyr) dataframe$paid <- as.Date(dataframe$paid) dataframe$send <- as.Date(dataframe$send) dataframe$id <- as.numeric(dataframe$id) dataframe$paid-dataframe$send count_fun<-function(myid){dataframe %>% filter(id<=myid) %>% mutate(diff=abs(paid-last(send))<120)%>% filter(id<myid) %>% summarise(sum(diff, na.rm = T)) %>% pull()} dataframe$result <- sapply(dataframe$id, count_fun) id send paid result 1 1 2013-01-25 <NA> 0 2 2 2013-02-21 2013-02-23 0 3 2 2013-02-21 2013-02-25 0 4 2 2013-02-21 2013-02-28 0 5 3 2013-03-01 2013-03-02 3 6 3 2013-03-01 2013-03-03 3 7 4 2013-06-23 2013-05-03 4 应用于id列。