Заполнение пропущенных дат в последовательности с сохранением других значений в строке в R - PullRequest
0 голосов
/ 17 мая 2018

У меня есть фрейм данных, который выглядит следующим образом:

ID <- c("A1","A1","A1","A1","A1","B1","B1","B1","B1")
Age <- c(0,1,2,3,4,0,1,2,3)
Date <- c("2006-05-03",NA,"2006-05-05",NA,"2006-05-07","2006-06-02",NA,"2006-06-04","2006-06-05")
Value1 <- c(6,6,6,6,6,4,4,4,4)

df
  ID Age       Date Value1
1 A1   0 2006-05-03      6
2 A1   1       <NA>      6
3 A1   2 2006-05-05      6
4 A1   3       <NA>      6
5 A1   4 2006-05-07      6
6 B1   0 2006-06-02      4
7 B1   1       <NA>      4
8 B1   2 2006-06-04      4
9 B1   3 2006-06-05      4

Каждый идентификатор имеет полную последовательность возраста (дней) разной длины, и я хотел бы заполнить отсутствующие даты, принадлежащие к значению возрастасоответственно.Для каждого идентификатора у меня всегда есть первая и последняя даты.

Я пытался

library(tidyr)
df1 <- df %>% 
        group_by(ID) %>% 
        complete(Date = seq(min(df$Date, na.rm = TRUE), max(df$Date, na.rm = TRUE), by ="days"))

, который работает для даты, но в то же время заменяет все другие значения в этой строке на NA.

Есть ли решение для заполнения Даты и сохранения всех других значений в строке?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вы можете mutate Date, добавив Age к первому Date группы:

ID <- c("A1","A1","A1","A1","A1","B1","B1","B1","B1")
Age <- c(0,1,2,3,4,0,1,2,3)
Date <- c("2006-05-03",NA,"2006-05-05",NA,"2006-05-07","2006-06-02",NA,"2006-06-04","2006-06-05")
Value1 <- c(6,6,6,6,6,4,4,4,4)

df <- data.frame(ID, Age, Date, Value1)

library(dplyr)
library(tidyr)

df %>% 
        group_by(ID) %>% 
        mutate(Date = first(as.Date(Date)) + Age)
#> # A tibble: 9 x 4
#> # Groups:   ID [2]
#>   ID      Age Date       Value1
#>   <fct> <dbl> <date>      <dbl>
#> 1 A1        0 2006-05-03      6
#> 2 A1        1 2006-05-04      6
#> 3 A1        2 2006-05-05      6
#> 4 A1        3 2006-05-06      6
#> 5 A1        4 2006-05-07      6
#> 6 B1        0 2006-06-02      4
#> 7 B1        1 2006-06-03      4
#> 8 B1        2 2006-06-04      4
#> 9 B1        3 2006-06-05      4

Создано в 2018-05-17 пакетом Представить (v0.2.0).

0 голосов
/ 17 мая 2018

Вы можете использовать fill для замены NA последним значением, отличным от NA, т.е.

library(tidyverse)

df %>% 
 mutate(Date = as.POSIXct(Date, '%Y-%m-%d')) %>% 
 group_by(ID) %>% 
 complete(Date = seq(min(Date, na.rm = TRUE), max(Date, na.rm = TRUE), by = "days")) %>% 
 fill(Age, Value1)

, что дает,

# A tibble: 9 x 4
# Groups:   ID [2]
  ID    Date                  Age Value1
  <chr> <dttm>              <dbl>  <dbl>
1 A1    2006-05-03 00:00:00    0.     6.
2 A1    2006-05-04 00:00:00    0.     6.
3 A1    2006-05-05 00:00:00    2.     6.
4 A1    2006-05-06 00:00:00    2.     6.
5 A1    2006-05-07 00:00:00    4.     6.
6 B1    2006-06-02 00:00:00    0.     4.
7 B1    2006-06-03 00:00:00    0.     4.
8 B1    2006-06-04 00:00:00    2.     4.
9 B1    2006-06-05 00:00:00    3.     4.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...