Заполнить фрейм данных временного ряда фиктивным нулем - PullRequest
0 голосов
/ 12 июня 2018

Полагаю, это довольно простые вопросы, тем не менее я не могу обойтись без этого.

Рассмотрим этот фрейм данных:

df <- data.frame(            
week = c(1,1,1,2,3,3,3),     
id = c(12,13,14,12,12,13,14),
x = sample(c(100:200), 7))   
df                           
#>   week id   x
#> 1    1 12 126
#> 2    1 13 166
#> 3    1 14 129
#> 4    2 12 128
#> 5    3 12 136
#> 6    3 13 120
#> 7    3 14 115

Я хотел бы создатьфиктивное значение 0 или NA для x для недели 2, где нет наблюдений для id 13 и 14. Другими словами: так, чтобы x = 0 для недели 2 id 13 и 14. Предпочтительно с dplyr.

Есть идеи, как это сделать?

1 Ответ

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

Хотя этот вопрос был помечен как дубликат group by, используемый здесь, на самом деле здесь не нужен.Также мы добавили зоопарк и несколько базовых ответов.

1) завершено (тидыр) complete в тидыре:

library(tidyr)

complete(DF, week, id)

давая:

# A tibble: 9 x 3
   week    id     x
  <int> <int> <int>
1     1    12   126
2     1    13   166
3     1    14   129
4     2    12   128
5     2    13    NA
6     2    14    NA
7     3    12   136
8     3    13   120
9     3    14   115

2) read.zoo / fortify.zoo (zoo) Создание разбиения объекта зоопарка на неделю, а затем преобразование его обратно в data.frame с использованием melt=TRUE:

library(zoo)

z <- read.zoo(DF, index = "id", split = "week")
fortify.zoo(z, melt = TRUE, names = names(DF)[c(2:1, 3)])

предоставление:

  id week   x
1 12    1 126
2 13    1 166
3 14    1 129
4 12    2 128
5 13    2  NA
6 14    2  NA
7 12    3 136
8 13    3 120
9 14    3 115

3) изменить форму (основание) изменить на широкую форму и затем вернуться к длинной форме:

wide <- reshape(DF, idvar = "week", timevar = "id", dir = "wide")
long <- reshape(wide, dir = "long")

names(long) <- names(DF)

4)tapply / as.data.frame.table (base)

as.data.frame.table(tapply(DF[[3]], DF[-3], c), responseName = names(DF)[3])

5) expand.grid / merge (base)

with(DF, merge(expand.grid(week = unique(week), id = unique(id)), DF, all = TRUE))
...