R Рассчитать дни вокруг дня события - PullRequest
2 голосов
/ 20 января 2020

У меня есть data.frame, и я хочу создать новый столбец с количеством дней вокруг определенного события.

Вот мой фрейм данных:

df <- tibble(
  date= lubridate::today()+c(1:7),
  event=c(NA,NA,NA,1,NA,NA,NA)
)

df
# A tibble: 7 x 2
  date       event
  <date>     <dbl>
1 2020-01-21    NA
2 2020-01-22    NA
3 2020-01-23    NA
4 2020-01-24     1
5 2020-01-25    NA
6 2020-01-26    NA
7 2020-01-27    NA

И вот мой желаемый результат:

# A tibble: 7 x 3
  date       event days_around
  <date>     <dbl>       <dbl>
1 2020-01-21    NA          -3
2 2020-01-22    NA          -2
3 2020-01-23    NA          -1
4 2020-01-24     1           0
5 2020-01-25    NA           1
6 2020-01-26    NA           2
7 2020-01-27    NA           3

У кого-нибудь есть идеи, как мне решить мою проблему?

Возможно, в сочетании с функцией seq_along или rleid.

Ответы [ 4 ]

3 голосов
/ 20 января 2020

Мы можем использовать:

df$days_around <- seq_along(df$date) - which(df$event == 1)
#Or use which.max
#df$days_around <- seq_along(df$date) - which.max(df$event)

#   date       event days_around
#  <date>     <dbl>       <int>
#1 2020-01-21    NA          -3
#2 2020-01-22    NA          -2
#3 2020-01-23    NA          -1
#4 2020-01-24     1           0
#5 2020-01-25    NA           1
#6 2020-01-26    NA           2
#7 2020-01-27    NA           3

В dplyr это будет:

library(dplyr)
df %>% mutate(days_around = row_number() - which(event == 1))
2 голосов
/ 20 января 2020

Вот базовое решение R

df <- within(df, days_around <- seq(nrow(df))-which(!is.na(event)))

такое, что

> df
# A tibble: 7 x 3
  date       event days_around
  <date>     <dbl>       <int>
1 2020-01-21    NA          -3
2 2020-01-22    NA          -2
3 2020-01-23    NA          -1
4 2020-01-24     1           0
5 2020-01-25    NA           1
6 2020-01-26    NA           2
7 2020-01-27    NA           3
1 голос
/ 20 января 2020

Вы можете попробовать что-то вроде этого:

pos <- which(!is.na(df$event))
date_event <- as.Date(df$date[pos])

df <- df %>%
  mutate(days_around = df$date - date_event)
1 голос
/ 20 января 2020

Вот возможное решение:

df %>% mutate(days_arround = 1:n() - (1:n())[!is.na(event)])

# A tibble: 7 x 3
  date       event days_arround
  <date>     <dbl>        <int>
1 2020-01-21    NA           -3
2 2020-01-22    NA           -2
3 2020-01-23    NA           -1
4 2020-01-24     1            0
5 2020-01-25    NA            1
6 2020-01-26    NA            2
7 2020-01-27    NA            3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...