如何编写针对时间序列循环的 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))
我有一个包含两列的数据集,年份和温度。
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))