R中的天气数据操作

Weather data manipulation in R

我目前正在做我的大学研究项目,我需要绘制一个区域的降水量。我已经下载了数据集,但我不知道如何将其转换为 R 中的时间序列格式。cvs 由 33 列组成,第一列是年,第二列是月,下一列是日期第 1 天到第 31 天。我想知道如何将这种格式转换为时间序列格式。例如,我想创建一个垂直而非水平的列。

我附上一张我的 csv 图片。谢谢!

这是一个使用tidyr将数据转换为时间序列的解决方案。首先,我们在包含 12 行和 31 列的矩阵中生成一些随机数据。

data <- as.data.frame(matrix(rnorm(12*31,10,4),nrow = 12))
colnames(data) <- paste0("Day",1:31)

接下来,我们将 yearmonth 列添加到日期列中。请注意,稍后我们需要清理没有 31 天的月份。

year <- rep(2019,12)
month <- 1:12

df <- cbind(year,month,data)

此时,数据的前几行和几列如下所示:

> head(data[1:7])
        Day1     Day2      Day3      Day4      Day5      Day6      Day7
1  0.2484915 10.25880  8.013013 11.057882 15.396539 14.861255 13.397043
2  8.8733834 11.42535 15.123711  6.586021  1.389619  5.884448 14.292295
3 12.5584852 10.80626 12.310648  8.705159 14.809994  6.334296  5.683926
4  7.3488391  5.62349 13.917364  6.397150  7.304381  5.154961  8.024700
5  2.1801690 11.03743 14.947513  5.594491 10.229679 12.254684 12.936003
6 13.8082670 10.82822 17.330590 13.948173  3.091670  8.376202 12.647662

最后,我们使用 tidyrlubridate 将列转换为行,使用 day 变量的列名中的数字。

df %>% group_by(year,month) %>%
     pivot_longer(.,starts_with("Day"),names_to = "day",names_prefix = "Day",
                  values_to = "value") %>%
     mutate(day = as.numeric(day)) %>%
     filter(((month %in% c(9,4,6,11) & day < 31) | (month == 2 & day <= 28) | 
                  month %in% c(1,3,5,7,8,10,12))) %>%
     mutate(date = ymd(sprintf("%4d-%02d-%02d",year,month,day)))-> narrowData
head(narrowData)

...以及输出:

> head(narrowData)
# A tibble: 6 x 5
# Groups:   year, month [1]
   year month   day  value date      
  <dbl> <int> <dbl>  <dbl> <date>    
1  2019     1     1  0.248 2019-01-01
2  2019     1     2 10.3   2019-01-02
3  2019     1     3  8.01  2019-01-03
4  2019     1     4 11.1   2019-01-04
5  2019     1     5 15.4   2019-01-05
6  2019     1     6 14.9   2019-01-06
> 

作为最后的检查,我们将确认输出数据框有 365 行,每一行代表 2019 年的每一天。

> # count number of rows in data frame, should be 365
> nrow(narrowData)
[1] 365
>

您可以熔化数据框,然后重新排序。

library(data.table)
library(stringr)

tsdf <-  melt(df, id = 1:2, measure. = colnames(df[-c(1,2)]))

tsdf$variable <- as.numeric(str_remove(tsdf$variable, "Day."))

tsdf$Date <- as.Date(paste(tsdf$Year, tsdf$Month, tsdf$variable, sep="-"))
tsdf <- tsdf[c(5,4)]
tsdf <- tsdf[order(tsdf$Date),]