将五年数据转换为年度数据,并在 R 中计算新记录



我希望有人能帮我解决这个问题。我正在使用每五年有记录的时间序列数据。数据框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

您要查找的内容称为线性插值。在 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

创建一个动物园类时间序列对象并将其合并为零宽度的年度 动物园对象,将具有用NA填充缺失岁月的效果。 然后应用na.approx使用线性填充NA值 插值给出 za。

(可以选择使用fortify.zoo

将其转换回 data.frame;但是,鉴于它是一个时间序列,如果将其表示为时间序列而不是将其转换回 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)

最新更新