如何在 R 中为 .data 格式创建时间序列?
How to create an time series in R for the .data format?
我在 R 中为此数据集读取和创建时间序列对象时遇到了一些困难:
SOI:https://psl.noaa.gov/data/correlation/soi.data
ONI:https://psl.noaa.gov/data/correlation/oni.data
通过查看数据,我们在第一列中有年份,在列中有月份(一月到十二月)
我希望 R 中的 SOI 有这样的东西:
YearMonth SOI
<mth> <dbl>
Jan 1948 -99.99
Feb 1948 -99.99
... ...
Sep 2021 -1.3
Oct 2021 -99.99
Nov 2021 -99.99
Dec 2021 -99.99
ONI 也一样:
YearMonth ONI
<mth> <dbl>
Jan 1950 -1.53
Feb 1950 -1.34
... ...
Aug 2021 -0.46
Sep 2021 -99.90
Oct 2021 -99.90
Nov 2021 -99.90
Dec 2021 -99.90
我认为这个数据集的排列可能是我遇到困难的根源,因为我无法正确地旋转这个数据。
我知道在堆栈中我们有优秀的 R 用户,他们肯定会帮助我进行最佳实践。
此函数似乎适用于共享的两个 link,但如果有更多标准方法获取数据,您可以使用它,因为它们会更可靠。
library(dplyr)
library(tidyr)
read_data <- function(link) {
read.table(link, skip = 1, fill = TRUE) %>%
slice(-(grep('-99.9', V1):n())) %>%
mutate(across(.fns = as.numeric)) %>%
pivot_longer(cols = -V1) %>%
mutate(name = month.abb[match(name, unique(name))]) %>%
unite(YearMonth, V1, name, sep = ' ')
}
d1 <- read_data('https://psl.noaa.gov/data/correlation/soi.data')
d1
# A tibble: 888 x 2
# YearMonth value
# <chr> <dbl>
# 1 1948 Jan -100.
# 2 1948 Feb -100.
# 3 1948 Mar -100.
# 4 1948 Apr -100.
# 5 1948 May -100.
# 6 1948 Jun -100.
# 7 1948 Jul -100.
# 8 1948 Aug -100.
# 9 1948 Sep -100.
#10 1948 Oct -100.
# … with 878 more rows
第二个link-
d2 <- read_data('https://psl.noaa.gov/data/correlation/oni.data')
d2
# A tibble: 864 x 2
# YearMonth value
# <chr> <dbl>
# 1 1950 Jan -1.53
# 2 1950 Feb -1.34
# 3 1950 Mar -1.16
# 4 1950 Apr -1.18
# 5 1950 May -1.07
# 6 1950 Jun -0.85
# 7 1950 Jul -0.54
# 8 1950 Aug -0.42
# 9 1950 Sep -0.39
#10 1950 Oct -0.44
# … with 854 more rows
我在 R 中为此数据集读取和创建时间序列对象时遇到了一些困难:
SOI:https://psl.noaa.gov/data/correlation/soi.data ONI:https://psl.noaa.gov/data/correlation/oni.data
通过查看数据,我们在第一列中有年份,在列中有月份(一月到十二月)
我希望 R 中的 SOI 有这样的东西:
YearMonth SOI
<mth> <dbl>
Jan 1948 -99.99
Feb 1948 -99.99
... ...
Sep 2021 -1.3
Oct 2021 -99.99
Nov 2021 -99.99
Dec 2021 -99.99
ONI 也一样:
YearMonth ONI
<mth> <dbl>
Jan 1950 -1.53
Feb 1950 -1.34
... ...
Aug 2021 -0.46
Sep 2021 -99.90
Oct 2021 -99.90
Nov 2021 -99.90
Dec 2021 -99.90
我认为这个数据集的排列可能是我遇到困难的根源,因为我无法正确地旋转这个数据。
我知道在堆栈中我们有优秀的 R 用户,他们肯定会帮助我进行最佳实践。
此函数似乎适用于共享的两个 link,但如果有更多标准方法获取数据,您可以使用它,因为它们会更可靠。
library(dplyr)
library(tidyr)
read_data <- function(link) {
read.table(link, skip = 1, fill = TRUE) %>%
slice(-(grep('-99.9', V1):n())) %>%
mutate(across(.fns = as.numeric)) %>%
pivot_longer(cols = -V1) %>%
mutate(name = month.abb[match(name, unique(name))]) %>%
unite(YearMonth, V1, name, sep = ' ')
}
d1 <- read_data('https://psl.noaa.gov/data/correlation/soi.data')
d1
# A tibble: 888 x 2
# YearMonth value
# <chr> <dbl>
# 1 1948 Jan -100.
# 2 1948 Feb -100.
# 3 1948 Mar -100.
# 4 1948 Apr -100.
# 5 1948 May -100.
# 6 1948 Jun -100.
# 7 1948 Jul -100.
# 8 1948 Aug -100.
# 9 1948 Sep -100.
#10 1948 Oct -100.
# … with 878 more rows
第二个link-
d2 <- read_data('https://psl.noaa.gov/data/correlation/oni.data')
d2
# A tibble: 864 x 2
# YearMonth value
# <chr> <dbl>
# 1 1950 Jan -1.53
# 2 1950 Feb -1.34
# 3 1950 Mar -1.16
# 4 1950 Apr -1.18
# 5 1950 May -1.07
# 6 1950 Jun -0.85
# 7 1950 Jul -0.54
# 8 1950 Aug -0.42
# 9 1950 Sep -0.39
#10 1950 Oct -0.44
# … with 854 more rows