Преобразовать пятилетние данные в годовые и рассчитать новые записи в R - PullRequest
0 голосов
/ 24 августа 2018

Я надеялся, что кто-нибудь сможет мне помочь с этой проблемой. Я работаю с данными временных рядов, записи которых публикуются каждые пять лет. Кадр данных df является примером с шагом по времени в df$Time и значениями записи в df$A.

df
Time    A
5   4.8
10  19.6
15  27.5
20  39.7

Мне нужно преобразовать df в годовой временной ряд и заполнить все новые записи новыми значениями на основе расчета. Я успешно преобразовал df в годовые данные df2, используя следующее:

df2  <- data.frame("Time" = c(5:20), "A" = c(5:20))
df2$A[] <- sapply(df2$A, function(x) df$A[match(x, df$Time)])
df2[is.na(df2)] <- 0
df2
Time    A
5   4.8
6   0
7   0
8   0
9   0
10  19.6
11  0
12  0
13  0
14  0
15  27.5
16  0
17  0
18  0
19  0
20  39.7

Что я не могу понять, так это как рассчитать новые значения для df2$A. Расчет зависит от относительного положения других значений строки / записи - например, для df2$A[2] вычисление будет df2$A[2] <- df2$A[1] + (df2$A[6] - df2$A[1])/5. Он также изменяется во всем фрейме данных, например df2$A[7] <- df2$A[6] + (df2$A[11] – df2$A[6]) / 5.

for Циклы приводят только к разочарованию, и я пытаюсь сделать это, не выполняя ни одной строки кода для каждой новой записи (реальные данные содержат сотни записей). Я пытаюсь добраться до df3 эффективным способом - спасибо!

df3
Time    A
5   4.8
6   7.76
7   10.72
8   13.68
9   16.64
10  19.6
11  21.18
12  22.76
13  24.34
14  25.92
15  27.5
16  29.94
17  32.38
18  34.82
19  37.26
20  39.7

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Создайте объект временного ряда класса зоопарка и объедините его с годовым объектом зоопарка нулевой ширины, который будет заполнять пропущенные годы NA.Затем примените na.approx, чтобы заполнить значения NA, используя линейную интерполяцию, дающую za.

(При желании его можно преобразовать обратно в data.frame, используя fortify.zoo; однако, учитывая, что это временной ряд, с ним будет легче работать в будущем, если он будет представлен как временной ряд ине преобразовал его обратно в data.frame.)

library(zoo)

z <- read.zoo(DF, FUN = identity)
g <- zoo(, start(z):end(z))  # grid
za <- na.approx(merge(z, g))

# fortify.zoo(za)

Примечание

Мы использовали thia в качестве ввода:

Lines <- "Time    A
5   4.8
10  19.6
15  27.5
20  39.7"
DF <- read.table(text = Lines, header = TRUE)
0 голосов
/ 24 августа 2018

То, что вы ищете, называется линейной интерполяцией.В R вы можете использовать функцию approx следующим образом:

df <- data.frame("Time" = c(5, 10, 15, 20), "A" = c(4.8, 19.6, 27.5, 39.7)) 
df2 <-  as.data.frame(approx(x = df$Time, y = df$A, xout = 5:20))
names(df2) <-  names(df)

Результат:

> df2
   Time     A
1     5  4.80
2     6  7.76
3     7 10.72
4     8 13.68
5     9 16.64
6    10 19.60
7    11 21.18
8    12 22.76
9    13 24.34
10   14 25.92
11   15 27.50
12   16 29.94
13   17 32.38
14   18 34.82
15   19 37.26
16   20 39.70
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...