R dplyr - проверять difftime в предыдущих строках - PullRequest
1 голос
/ 12 июня 2019

мой фрейм данных выглядит так:

   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, который будет считать строки выше, где разница между send для фактических id и paid дат выше этой id равна менее 120 дней.

Другими словами, нет строки выше для id 1, поэтому результат будет 0, result для id 2 должен быть 0, поскольку значение выше NA. Результат для id 3 будет равен 3, поскольку разница между 2013-03-01 и (2013-02-23, 2013-02-25, 2013-02-28) составляет менее 120 дней. Результат для id 4 должен быть равен 4, поскольку разница между 2013-06-23 составляет менее 120 дней для дат (2013-03-03, 2013-03-02, 2013-02-28, 2013-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)

1 Ответ

0 голосов
/ 12 июня 2019

Можно сделать это, используя пакет 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 с помощью функции шага 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...