簡體   English   中英

R dplyr-檢查前一行的difftime

[英]R dplyr - check difftime on previous rows

我的數據框如下所示:

   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)

我想做的是在dplyr為每個id創建新的列結果, dplyr列結果將對以上行進行計數,其中實際id發送與該id上方的paid日期之間的差小於120天。

換句話說, id 1上面沒有行,所以結果將為0, id 2的result應該為0,因為上面的值為NA 結果為id 3將是3,因為之間差2013-03-01和( 2013-02-232013-02-252013-02-28 )小於120天。 結果為id 4應該是4,因為之間差2013-06-23是小於120天的日期( 2013-03-032013-03-022013-02-282013-02-25 )。

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

使用dplyr包可以做到這一點:

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

說明:第一步,定義一個函數,該函數對小於給定索引(小於120天)的索引行進行計數。 第二步,應用sapply使用步驟1的功能ID列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM