Вот комбинация tidyverse
и базовый метод R для достижения результата. Сначала мы создаем новый столбец с совокупными средними значениями для каждого столбца. Затем мы complete
пропустили наблюдения и заменили NA
соответствующими значениями из других столбцов.
library(tidyverse)
cols <- c("A", "B", "C")
df1 <- df %>%
mutate_at(cols, list(mean = ~cummean(.))) %>%
complete(Time_Stamp = seq(min(Time_Stamp), max(Time_Stamp), by = "sec")) %>%
fill(ends_with("mean")) %>%
mutate(ID = row_number())
mean_cols <- grep("_mean$", names(df1))
df1[cols] <- Map(function(x, y) ifelse(is.na(x), y, x), df1[cols], df1[mean_cols])
df1[names(df)]
# ID Time_Stamp A B C
# <int> <dttm> <dbl> <dbl> <dbl>
# 1 1 2018-02-02 07:45:00 123 567 434
# 2 2 2018-02-02 07:45:01 234 100 110
# 3 3 2018-02-02 07:45:02 234 100 110
# 4 4 2018-02-02 07:45:03 197 256. 218
# 5 5 2018-02-02 07:45:04 197 256. 218
# 6 6 2018-02-02 07:45:05 197 256. 218
# 7 7 2018-02-02 07:45:06 197 256. 218
# 8 8 2018-02-02 07:45:07 197 256. 218
# 9 9 2018-02-02 07:45:08 197 256. 218
#10 10 2018-02-02 07:45:09 197 256. 218
#11 11 2018-02-02 07:45:10 112 2323 2323
#12 12 2018-02-02 07:45:11 176. 772. 744.
#13 13 2018-02-02 07:45:12 176. 772. 744.
#14 14 2018-02-02 07:45:13 176. 772. 744.
#15 15 2018-02-02 07:45:14 176. 772. 744.
#16 16 2018-02-02 07:45:15 100 23 12
Если вам нужно скользящее среднее для каждого значения NA
, оно становится немного проще
df %>%
complete(Time_Stamp = seq(min(Time_Stamp), max(Time_Stamp), by = "sec")) %>%
mutate_at(cols, ~ifelse(is.na(.), cummean(na.omit(.)), .)) %>%
mutate(ID = row_number())
Данные
df <- structure(list(ID = c(1, 2, 3, 4, 5), Time_Stamp = structure(c(1517557500,
1517557501, 1517557502, 1517557510, 1517557515), class = c("POSIXct",
"POSIXt"), tzone = "UTC"), A = c(123, 234, 234, 112, 100), B = c(567,
100, 100, 2323, 23), C = c(434, 110, 110, 2323, 12)), row.names = c(NA,
-5L), class = "data.frame")
который выглядит как
df
# ID Time_Stamp A B C
#1 1 2018-02-02 07:45:00 123 567 434
#2 2 2018-02-02 07:45:01 234 100 110
#3 3 2018-02-02 07:45:02 234 100 110
#4 4 2018-02-02 07:45:10 112 2323 2323
#5 5 2018-02-02 07:45:15 100 23 12