【问题标题】:Convert five-year data to annual data and calculate new records in R将五年数据转换为年度数据并计算 R 中的新记录
【发布时间】:2023-03-11 23:23:01
【问题描述】:

我希望有人可以帮助我解决这个问题。我正在处理每五年记录一次的时间序列数据。以数据框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] &lt;- df2$A[1] + (df2$A[6] - df2$A[1])/5。它还会在整个数据框中发生变化,例如df2$A[7] &lt;- 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 dataframe time-series


    【解决方案1】:

    您正在寻找的是所谓的线性插值。在 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
    

    【讨论】:

    • 谢谢 - 这工作得很好。在我看到这个之前,我还使用了 imputeTS 库和它们的线性插补函数,它也很有效。但是大约更直接
    • @James_S 欢迎您。顺便说一句,您还应该考虑使用zooother answer。根据进一步的任务,拥有一个用于时间序列的对象可能很有用。
    【解决方案2】:

    创建一个动物园类时间序列对象并将其与零宽度年度合并 zoo 对象将具有用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)
    

    【讨论】:

      猜你喜欢
      • 2020-08-14
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2022-01-01
      • 2015-12-22
      相关资源
      最近更新 更多