如何在 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