【问题标题】:R dplyr - check difftime on previous rowsR dplyr - 检查前几行的差异时间
【发布时间】:2019-06-12 09:25:08
【问题描述】:

我的数据框如下所示:

   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 创建新的列结果,这将计算上面的行,其中发送实际idpaid 日期在此id 之上的日期之间的差异是不到 120 天。

换句话说,上面没有id 1 的行,因此结果将为0,id 2 的result 应该为0,因为上面的值为NAid 3 的结果将是 3,因为 2013-03-01 和 (2013-02-23, 2013-02-25, 2013-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)

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: r dplyr


【解决方案1】:

使用 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应用到id列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-24
    • 2014-11-05
    • 1970-01-01
    • 2011-03-10
    • 2023-04-09
    • 2021-12-13
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多