시계열 및 1 개 또는 3 개의 그룹화 필드가 포함 된 data.frame이 제공됩니다. 그래서 우리는 여러 개의 시계열을 가지고 있습니다 - 각 그룹화 조합마다 하나씩. 그러나 일부 날짜가 누락되었습니다. 올바른 그룹 값으로이 날짜를 추가하는 것이 가장 쉬운 방법입니다 (가장 "깔끔한 방식"이라는 측면에서).그룹화 된 시계열에서 누락 날짜를 채우는 - 깔끔한 방법?
일반적으로 나는 모든 날짜와 함께 data.frame을 생성하고 내 시간 계열과 함께 full_join을 수행한다고 말할 수 있습니다. 그러나 이제는 그룹화 값의 각 조합에 대해이를 수행해야하며 그룹화 값을 채워야합니다.
library(dplyr)
library(lubridate)
set.seed(1234)
# Time series should run vom 2017-01-01 til 2017-01-10
date <- data.frame(date = seq.Date(from=ymd("2017-01-01"), to=ymd("2017-01-10"), by="days"), v = 1)
# Two grouping dimensions
d1 <- data.frame(d1 = c("A", "B", "C", "D"), v = 1)
d2 <- data.frame(d2 = c(1, 2, 3, 4, 5), v = 1)
# Generate the data.frame
df <- full_join(date, full_join(d1, d2)) %>%
select(date, d1, d2)
# and ad to value columns
df$v1 <- runif(200)
df$v2 <- runif(200)
# group by the dimension columns
df <- df %>%
group_by(d1, d2)
# create missing dates
df.missing <- df %>%
filter(v1 <= 0.8)
# So now 2017-01-01 and 2017-01-10, A, 5 are missing now
df.missing %>%
filter(d1 == "A" & d2 == 5)
# A tibble: 8 x 5
# Groups: d1, d2 [1]
date d1 d2 v1 v2
<date> <fctr> <dbl> <dbl> <dbl>
1 2017-01-02 A 5 0.21879954 0.1335497
2 2017-01-03 A 5 0.32977018 0.9802127
3 2017-01-04 A 5 0.23902573 0.1206089
4 2017-01-05 A 5 0.19617465 0.7378315
5 2017-01-06 A 5 0.13373890 0.9493668
6 2017-01-07 A 5 0.48613541 0.3392834
7 2017-01-08 A 5 0.35698708 0.3696965
8 2017-01-09 A 5 0.08498474 0.8354756
그래서 모든 날짜와 data.frame을 생성 누락 된 날짜를 추가 :
를먼저 내가 누락 된 값으로 data.frame을 만듭니다
의 예를 살펴 보자 (: df.missing는 GROUP_BY는 (D1, D2입니다) 기억)
start <- min(df.missing$date)
end <- max(df.missing$date)
all.dates <- data.frame(date=seq.Date(start, end, by="day"))
아니 내가 그런 짓을 할
그럼) (my_join를 정의 할 수 있습니다 :
my_join <- function(data) {
# get value of both dimensions
d1.set <- data$d1[[1]]
d2.set <- data$d2[[1]]
tmp <- full_join(data, all.dates) %>%
# First we need to ungroup. Otherwise we can't change d1 and d2 because they are grouping variables
ungroup() %>%
mutate(
d1 = d1.set,
d2 = d2.set
) %>%
group_by(d1, d2)
return(tmp)
}
이제 우리는 각 조합 my_join()를 호출하고 한 번 봐 "A/5"
df.missing %>%
do(my_join(.)) %>%
filter(d1 == "A" & d2 == 5)
# A tibble: 10 x 5
# Groups: d1, d2 [1]
date d1 d2 v1 v2
<date> <fctr> <dbl> <dbl> <dbl>
1 2017-01-02 A 5 0.21879954 0.1335497
2 2017-01-03 A 5 0.32977018 0.9802127
3 2017-01-04 A 5 0.23902573 0.1206089
4 2017-01-05 A 5 0.19617465 0.7378315
5 2017-01-06 A 5 0.13373890 0.9493668
6 2017-01-07 A 5 0.48613541 0.3392834
7 2017-01-08 A 5 0.35698708 0.3696965
8 2017-01-09 A 5 0.08498474 0.8354756
9 2017-01-01 A 5 NA NA
10 2017-01-10 A 5 NA NA
우수함 수 있습니다! 그것이 우리가 찾고 있었던 것입니다. 그러나 우리는 my_join에 d1과 d2를 정의해야하며 조금 어색함을 느낍니다.
그래서이 솔루션에는 어떤 방식 으로든 방해가 있습니까?
PS : 나는 요지에 코드를 삽입 한 다음은