Вычислить расстояние (время) между упорядоченными строками сгруппированных переменных с помощью dplyr и tidyr - PullRequest
0 голосов
/ 17 июня 2020

Я хотел бы присвоить разницу во времени последней записи в каждой группе.

Это набор данных моей игрушки (dfx):

vals<- 1:5 
grps <- c(1,1,2,2,2)
dts <- as.Date(c("2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-05"))
dfx <- as_tibble(cbind(vals,grps,dts))
colnames(dfx) <- c("vals","grps","dts")
(dfx <- dfx %>% mutate(dts = as.Date(dts)))

dfx - это тиббл 5 x 3:

   vals  grps dts       
  <dbl> <dbl> <date>    
1     1     1 2020-01-01
2     2     1 2020-01-02
3     3     2 2020-01-03
4     4     2 2020-01-04
5     5     2 2020-01-05

grps - группирующая переменная; здесь он содержит 2 группы (1,2). Моим желаемым результатом будет расстояние (в днях) от последнего дня каждой группы, и оно должно выглядеть как rslt (результат моей игрушки):

bfr <-as.tibble(c(1,0,2,1,0))
colnames(bfr) <- "dist"
(rslt <- bind_cols(dfx,bfr))
   vals  grps dts         dist
  <dbl> <dbl> <date>     <dbl>
1     1     1 2020-01-01     1
2     2     1 2020-01-02     0
3     3     2 2020-01-03     2
4     4     2 2020-01-04     1
5     5     2 2020-01-05     0

Если возможно, я бы хотел использовать dplyr, lubridate и tidyr, чтобы сделать это.

1 Ответ

1 голос
/ 17 июня 2020

Убедитесь, что ваши даты расположены по порядку. Используйте group_by для группировки по grps, а затем возьмите разницу между last(dts) и каждой строкой.

library(tidyverse)

dfx %>% 
  mutate(dts = as.Date(dts, origin = "1970-01-01")) %>%
  arrange(dts) %>%
  group_by(grps) %>%
  mutate(dist = as.numeric(last(dts) - dts))

Вывод

# A tibble: 5 x 4
# Groups:   grps [2]
   vals  grps dts         dist
  <dbl> <dbl> <date>     <dbl>
1     1     1 2020-01-01     1
2     2     1 2020-01-02     0
3     3     2 2020-01-03     2
4     4     2 2020-01-04     1
5     5     2 2020-01-05     0
...