如何编写针对时间序列循环的 r 代码?

How do I write r code that loops for a time series?

我有一个包含两列的数据集,年份和温度。

Year     Temperature
1869     51.4
1870     53.6
1871     51.1
1872     51.0
1873     51.0
1874     51.3
1875     49.4
1876     51.9
1877     52.8
1878     53.6
1879     52.3
1880     53.2
1881     52.4
1882     52.0
1883     50.5
1884     52.4
1885     51.1
1886     51.0
1887     50.9
1887     49.3

我需要编写一个 r 脚本来计算每年的平均百分比变化,绘制并打印输出以及原始数据。

例如,1873 年的平均百分比变化 =((1874 年至 1878 年的平均值 - 1869 年至 1873 年的平均值)/1874 年至 1878 年的平均值)*100 我需要对 1874 年到 1884 年重复此操作,将结果打印在 csv 文件中,并绘制为时间序列以及原始数据。

我不确定从这里开始,欢迎任何想法或建议。

首先,您需要计算每 5 年的平均温度。您可以使用 embed()rowMeans():

x <- c(51.4, 53.6, 51.1, 51.0, 51.0,
       51.3, 49.4, 51.9, 52.8, 53.6,
       52.3, 53.2, 52.4, 52.0, 50.5,
       52.4, 51.1, 51.0, 50.9, 49.3)

M <- embed(x)
M
#      [,1] [,2] [,3] [,4] [,5]
# [1,] 51.0 51.0 51.1 53.6 51.4
# [2,] 51.3 51.0 51.0 51.1 53.6
# [3,] 49.4 51.3 51.0 51.0 51.1
# [4,] 51.9 49.4 51.3 51.0 51.0
# [5,] 52.8 51.9 49.4 51.3 51.0
# [6,] 53.6 52.8 51.9 49.4 51.3
# [7,] 52.3 53.6 52.8 51.9 49.4
# [8,] 53.2 52.3 53.6 52.8 51.9
# [9,] 52.4 53.2 52.3 53.6 52.8
#[10,] 52.0 52.4 53.2 52.3 53.6
#[11,] 50.5 52.0 52.4 53.2 52.3
#[12,] 52.4 50.5 52.0 52.4 53.2
#[13,] 51.1 52.4 50.5 52.0 52.4
#[14,] 51.0 51.1 52.4 50.5 52.0
#[15,] 50.9 51.0 51.1 52.4 50.5
#[16,] 49.3 50.9 51.0 51.1 52.4

means <- rowMeans(M)
means
# [1] 51.62 51.60 50.76 50.92 51.28 51.80 52.00 52.76 52.86 52.70 52.08 52.10
#[13] 51.68 51.40 51.18 50.94

这些是 1969-1973 到 1984-1988 的 16 种方法。您可以像这样计算从 1973 年到 1983 年的 to-year 百分比变化:

changes <- 100 * (means[6:16] - means[1:11]) / means[6:16]
changes
# [1]  0.3474903  0.7692308  3.7907506  3.6700719  2.6944972  0.5376344
# [7]  0.1919386 -2.0897833 -2.8404669 -2.9699101 -2.2379270

在将 changes(11 个元素)添加到数据框(20 行)之前,您需要用 NA 填充它,以便年份对齐:

changes <- c(rep(NA, 4), changes, rep(NA, 5))

您可以 运行 ?plot?write.csv 获得有关绘制和保存数据框的帮助 .csv

这是包含温度变化百分比的数据集。它使用 data.table。如果您有相关经验,我建议您使用 ggplot 绘制图表。

df2 <- data.frame(Year =c(1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1887),
                  Temperature = c(51.4, 53.6, 51.1, 51.0, 51.0, 51.3, 49.4, 51.9, 52.8, 53.6, 52.3, 53.2, 52.4, 52.0, 50.5, 52.4, 51.1, 51.0, 50.9, 49.3))
df2 <- as.data.table(df2)

mean_df <- df2[,mean_temp := mean(Temperature),by =c("Year")]
mean_df <- unique(mean_df,by=c("Year","mean_temp"))

temperature_change <- mean_df[,temp_change := (mean_temp/shift(mean_temp,1L,type="lag"))*100-100]
temperature_change$Temperature <- NULL

df3 <- merge(df2,temperature_change,by=c("Year","mean_temp"), all=T)

使用图书馆(动物园)我们可以做到

l = rollmean(head(x, -5)[,2], 5)
r = rollmean(tail(x, -5)[,2], 5)
percent_change = 100 * (r-l)/r
# [1]  0.3474903  0.7692308  3.7907506  3.6700719  2.6944972  0.5376344  0.1919386 -2.0897833 -2.8404669
#[10] -2.9699101 -2.2379270

数据:

x = structure(list(Year = c(1869, 1870, 1871, 1872, 1873, 1874, 1875, 
1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 
1887, 1887), Temp = c(51.4, 53.6, 51.1, 51, 51, 51.3, 49.4, 51.9, 
52.8, 53.6, 52.3, 53.2, 52.4, 52, 50.5, 52.4, 51.1, 51, 50.9, 
49.3)), class = "data.frame", row.names = c(NA, -20L))