将五年数据转换为年度数据并计算R

时间:2018-08-24 13:25:39

标签: r dataframe time-series

我希望有人可以帮助我解决这个问题。我正在使用每五年记录一次的时间序列数据。数据帧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 :(得分:3)

您要寻找的是线性插值。在R中,您可以像这样使用 map.data.setStyle({ strokeColor: '#FF0000', strokeOpacity: 0.8, strokeWeight: 2, fillColor: '#FF0000', fillOpacity: 0.35 }); 函数:

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)

答案 1 :(得分:2)

创建一个Zoo类时间序列对象,并将其与零宽度的Annual合并 动物园对象,其效果是使用select n+1 from my_tab right outer join (select (d1.n*10 + d2.n) n from (select 1 as n union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 0 ) d1 cross join (select 1 as n union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 0 ) d2) temp_num on tab_id = n+1 where tab_id is null order by n 来填充缺少的年份。然后应用NA以使用线性填充na.approx值 内插给出za。

(可以选择使用NA将其转换回data.frame;但是,由于它是一个时间序列,因此如果将其表示为时间序列而不是时间序列,将来会更容易处理。将其转换回data.frame。)

fortify.zoo

注意

我们用thia作为输入

library(zoo)

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

# fortify.zoo(za)