2016-12-07 1 views
0

Допустим, у меня есть dataframe:Расширение данных временных рядов длиной формата с недостающими Ряды

df <- data.frame(group = c('A','A','A','B','B','B','C','C','C'), 
time = c(1,2,4,1,2,3,5,7,8), 
data = c(5,6,7,8,9,10,1,2,3)) 

То, что я хочу сделать, это вставить данные в кадр данных, где она отсутствует в последовательности. Таким образом, в приведенном выше примере мне не хватает данных для времени = 3 для группы A, а время = 4 для группы B и времени = 6 для группы C. Я бы по сути захотел поставить NAs вместо столбца данных. Как я могу добавить эти дополнительные строки? Мне нужно обобщенное решение ПРИМЕЧАНИЕ: Я ИЗОБРАЖЕН ВОПРОС, КАК ЕСТЬ ОШИБКА ОСТРОВА МЫ НЕ МОЖЕМ ПРИНИМАТЬ, ЧТО БУДЕТ ТОЛЬКО 4 ЗАМЕЧАНИЯ ДЛЯ КАЖДОЙ ГРУППЫ.

Цель будет:

df <- data.frame(group = c('A','A','A','A','B','B','B','C','C','C','C'), 
    time = c(1,2,3,4,1,2,3,5,6,7,8), 
    data = c(5,6,NA,7,8,9,10,1,NA,2,3)) 
+0

«Итак, в приведенном выше примере у меня отсутствуют данные для времени = 3 для группы A, а время = 4 для группы B и времени = 6 для группы C." - Откуда ты это знаешь? Есть ли другая структура данных, которая говорит вам об этом, или есть критерий, который вы можете сформулировать, посредством чего вы можете сделать это из показанного кадра данных? – Amadan

+0

Один из следующих вариантов: 'df.fill = merge (df, expand.grid (group = unique (df $ group), time = min (df $ time): max (df $ time)), all = TRUE)' , 'expand.grid' создает фрейм данных, содержащий все возможные комбинации' group' и 'time'. Вы объединяете это в свой исходный фрейм данных как полное соединение ('all = TRUE' позаботится об этом), давая вам новые строки для отсутствующих комбинаций. – eipi10

+0

Этот вопрос кажется дублирующим [this] (http://stackoverflow.com/questions/9996452/r-find-and-add-missing-non-existing-rows-in-time-related-data-frame) , [this] (http://stackoverflow.com/questions/16787038/r-insert-rows-for-missing-dates-times), [это] (http://stackoverflow.com/questions/31150028/insert- missing-time-rows-in-a-dataframe) и, возможно, другие вопросы SO. – eipi10

ответ

0

Вот один вариант использования data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(df)), разверните набор данных, сгруппированный по 'группе', от min до max от 'time' и присоедините on столбцы 'group' и 'time'.

library(data.table) 
setDT(df)[df[, .(time = min(time):max(time)) , by = group], on = c("group", "time")] 
# group time data 
# 1:  A 1 5 
# 2:  A 2 6 
# 3:  A 3 NA 
# 4:  A 4 7 
# 5:  B 1 8 
# 6:  B 2 9 
# 7:  B 3 10 
# 8:  C 5 1 
# 9:  C 6 NA 
#10:  C 7 2 
#11:  C 8 3 
+0

У меня была опечатка в вопросе –

+0

@JaideepSamuel Я обновил сообщение. Также прочитайте [это] (http://stackoverflow.com/help/someone-answers) – akrun