如何编写在时间序列中循环的r代码?

问题描述

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

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文件中,并与原始数据一起绘制为时间序列。

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

解决方法

使用库(动物园)我们可以做

l = rollmean(head(x,-5)[,2],5)
r = rollmean(tail(x,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.3,49.4,51.9,52.8,52.3,53.2,52.4,52,50.5,50.9,49.3)),class = "data.frame",row.names = c(NA,-20L))
,

开始时,您需要计算每5年周期的平均温度。您可以使用embed()rowMeans()来做到这一点:

x <- c(51.4,51.0,52.0,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年之间的年百分比变化:

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,Temperature = c(51.4,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,"mean_temp"),all=T)