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)
接下来,我们将 year
和 month
列添加到日期列中。请注意,稍后我们需要清理没有 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
最后,我们使用 tidyr
和 lubridate
将列转换为行,使用 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),]
我目前正在做我的大学研究项目,我需要绘制一个区域的降水量。我已经下载了数据集,但我不知道如何将其转换为 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)
接下来,我们将 year
和 month
列添加到日期列中。请注意,稍后我们需要清理没有 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
最后,我们使用 tidyr
和 lubridate
将列转换为行,使用 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),]