在时间序列数据中插入缺失的行

时间:2019-12-20 01:25:53

标签: r dataframe timestamp

我有一个不完整的时间序列数据帧,我需要插入NA行以丢失时间戳。每天应该始终有6个时间戳,这在数据帧中由变量“信号”(1-6)表示。我正在尝试将不完整的数据帧$post = Post::query()->...->findOrFail($id)->???...与包含所有信号的向量A合并。下面是简化的示例数据:

B

请注意,B <- rep(1:6,2) A <- data.frame(Signal = c(1,2,3,5,1,2,4,5,6), var1 = c(1,1,1,1,1,1,1,1,1)) Expected <- data.frame(Signal = c(1,2,3,NA, 5, NA, 1,2,NA,4,5,6), var1 = c(1,1,1,NA,1,NA,1,1,NA,1,1,1) 代表具有多个变量的数据帧,而B中的NA是数据帧中NA的行。另外,实际的数据框具有更多的观测值(总共84个)。

如果你们能帮助我的话会很棒!

1 个答案:

答案 0 :(得分:2)

如果您已经知道一天中有6个时间戳,则可以不用B来完成。我们可以为每天创建分组,并使用completeNA添加缺失的观测值。

library(dplyr)
library(tidyr)

A %>%
  group_by(gr = cumsum(c(TRUE, diff(Signal) < 0))) %>%
  complete(Signal = 1:6) %>%
  ungroup() %>%
  select(-gr)

#   Signal  var1
#    <dbl> <dbl>
# 1      1     1
# 2      2     1
# 3      3     1
# 4      4    NA
# 5      5     1
# 6      6    NA
# 7      1     1
# 8      2     1
# 9      3    NA
#10      4     1
#11      5     1
#12      6     1

如果在输出中您需要Signal作为NA作为缺少组合,则可以使用

A %>%
  group_by(gr = cumsum(c(TRUE, diff(Signal) < 0))) %>%
  complete(Signal = 1:6) %>%
  mutate(Signal = replace(Signal, is.na(var1), NA)) %>%
  ungroup %>%
  select(-gr)

#   Signal  var1
#    <dbl> <dbl>
# 1      1     1
# 2      2     1
# 3      3     1
# 4     NA    NA
# 5      5     1
# 6     NA    NA
# 7      1     1
# 8      2     1
# 9     NA    NA
#10      4     1
#11      5     1
#12      6     1