R Программирование базовой интерполяции - PullRequest
1 голос
/ 04 июля 2019

A имеет DataFrame с именем TideModel, который имеет следующие столбцы и данные выборки.

По сути, он состоит из данных Tide каждые минуты и атмосферного давления каждые 5. Я хотел бы интерполировать и выводить атмосферное давление каждую минуту вновый столбец, называемый скажем AtmP new.

Кажется, что путь в среднем из 9 строк - это путь вперед, но я не могу понять, как это сделать.Я пробовал ок и colMeans.

Time   Tide   AtmP
00:00   0.51 1010.75
00:01   0.52      NA
00:02   0.52      NA
00:03   0.52      NA
00:04   0.52      NA
00:05   0.52      NA
00:06   0.52 1010.25
00:07   0.52      NA
00:08   0.52      NA
00:09   0.52      NA
00:10   0.53      NA
00:11   0.53      NA
00:12   0.53 1010.45
00:13   0.53      NA
00:14   0.53      NA
00:15   0.53      NA
00:16   0.54      NA
00:17   0.54      NA
00:18   0.54 1010.55

Я играл с ок и colMeans, но, похоже, ничего не работает

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

1) Используйте na.spline (для сплайн-интерполяции) или na.approx (для линейной интерполяции) или na.locf (для переноса последнего не-NA вперед).Все в пакете зоопарка.Мы показываем na.spline ниже, но вы можете заменить любой из перечисленных, если хотите.Посмотрите этот пакет для этих и других процедур na. *.(Примечание в конце показывает ввод в воспроизводимой форме.)

library(zoo)
transform(TideModel, AtmP = na.spline(AtmP))

, давая:

    Time Tide     AtmP
1  00:00 0.51 1010.750
2  00:01 0.52 1010.584
3  00:02 0.52 1010.456
4  00:03 0.52 1010.362
5  00:04 0.52 1010.299
6  00:05 0.52 1010.263
7  00:06 0.52 1010.250
8  00:07 0.52 1010.256
9  00:08 0.52 1010.278
10 00:09 0.52 1010.312
11 00:10 0.53 1010.355
12 00:11 0.53 1010.402
13 00:12 0.53 1010.450
14 00:13 0.53 1010.495
15 00:14 0.53 1010.534
16 00:15 0.53 1010.562
17 00:16 0.54 1010.577
18 00:17 0.54 1010.574
19 00:18 0.54 1010.550

2) Если вы хотите заменить каждое NA на среднее значениеиз 9 рядов вокруг него:

library(zoo)

transform(TideModel, 
  AtmP = ifelse(is.na(AtmP), 
           rollapply(AtmP, 9, mean, na.rm = TRUE, partial = TRUE), 
           AtmP)
)

Примечание

Lines <- "Time   Tide   AtmP
00:00   0.51 1010.75
00:01   0.52      NA
00:02   0.52      NA
00:03   0.52      NA
00:04   0.52      NA
00:05   0.52      NA
00:06   0.52 1010.25
00:07   0.52      NA
00:08   0.52      NA
00:09   0.52      NA
00:10   0.53      NA
00:11   0.53      NA
00:12   0.53 1010.45
00:13   0.53      NA
00:14   0.53      NA
00:15   0.53      NA
00:16   0.54      NA
00:17   0.54      NA
00:18   0.54 1010.55"
TideModel <- read.table(text = Lines, header = TRUE)
0 голосов
/ 04 июля 2019

Вы можете проверить функцию na.interp() из пакета forecast.na.interp() заменяет пропущенные значения интерполированными значениями.И он также может интерполировать сезонные данные.
Как указано в его документации;

По умолчанию используется линейная интерполяция для несезонных рядов.Для сезонных рядов сначала вычисляется устойчивое разложение STL.Затем к сезонно скорректированным данным применяется линейная интерполяция, а сезонный компонент добавляется обратно.

na.interp() не может напрямую работать с кадрами данных.Вам нужно будет преобразовать ваши данные в объект временного ряда (объекты ts или msts. Msts обозначает многосезонный временной ряд; временной ряд, который имеет множественную сезонность, например, почасовая сезонность и еженедельная сезонность).

Код будет примерно таким, как показано ниже.Это общий код для понимания идеи, он не адаптирован к вашим данным.

library(forecast)
my_msts <- df['A'] %>% 
 msts() %>%
 na.interp()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...