【发布时间】:2020-07-31 21:56:51
【问题描述】:
我已经阅读了多个线程,解释应该不鼓励使用 for 循环,如果有更好的方法我想学习的话。我会说我已经尝试将summarize() 与group_by() 结合使用。
我想要完成的是,我想开发一个气候数据库。我已成功编程 R 以直接从源下载数据,并将列表转换为 data.frame。现在我想按月和年对多个列进行求和和/或平均。因此,我为什么尝试使用summarize 和group_by。我的问题是数据带有我想保留的代码“M”或“T”,所以我任意给它们整数 M = 9999 和 T = 9998。我想在需要操作代码时我可以使用 for循环以逐行评估并将这 2 个占位符转换为“0”并返回该子集中有多少“M”和“T”。
以下是数据的到达方式:
$data
# A tibble: 935 x 8
date datatype station value fl_m fl_q fl_so fl_t
<chr> <chr> <chr> <int> <chr> <chr> <chr> <chr>
1 2020-01-01T00:0~ PRCP GHCND:USW0002~ 76 "" "" W "240~
2 2020-01-01T00:0~ SNOW GHCND:USW0002~ 0 "T" "" W ""
3 2020-01-01T00:0~ SNWD GHCND:USW0002~ 0 "T" "" W ""
4 2020-01-01T00:0~ TMAX GHCND:USW0002~ 39 "" "" W "240~
5 2020-01-01T00:0~ TMIN GHCND:USW0002~ -5 "" "" W "240~
6 2020-01-02T00:0~ PRCP GHCND:USW0002~ 3 "" "" W "240~
7 2020-01-02T00:0~ SNOW GHCND:USW0002~ 5 "" "" W ""
8 2020-01-02T00:0~ SNWD GHCND:USW0002~ 0 "" "" W ""
9 2020-01-02T00:0~ TMAX GHCND:USW0002~ 11 "" "" W "240~
10 2020-01-02T00:0~ TMIN GHCND:USW0002~ -10 "" "" W "240~
# ... with 925 more rows
这是我用来将其从列表转换为 data.frame 的代码:
## Convert a list from NCDC into a data frame
## mso_data is a placeholder file for the downloaded data from NCDC
## mso_light2 is a placeholder for the destination data frame
## NCDC downloads in a list, the data is stored in the $data portion
library(tidyverse)
## first convert from list to data.frame and remove 'station ID' column
mso_light2 <- mso_data$data[, -3]
## remove time from date group
mso_date <- mso_light2[1]
mso_date <- sub("T.*", "", mso_date$date)
mso_light2$date <- mso_date
## remove flags for fl_so? and fl_t (time)
mso_light2 <- mso_light2[1:5]
## Change 'T' = 9998 & 'M' = 9999
mso_light2$value[mso_light2$fl_m == "T"] <- 9998
mso_light2$value[mso_light2$fl_q == "M"] <- 9999
## pivot data frame
## eventually use to change column names
## v_names <- c('PRCP', 'SNOW', 'SNWD', 'TMAX', 'TMIN')
mso_light2 <- mso_light2[1:3]
mso_light2 <- pivot_wider(mso_light2,
names_from = datatype,
values_from = value)
这是转换后data.frame的样子,我添加了月份和年份的列以及日平均温度“TAVG”:
# A tibble: 187 x 9
# Rowwise:
date PRCP SNOW SNWD TMAX TMIN TAVG month year
<date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2020-01-01 76 9998 9998 39 -5 17 1 2020
2 2020-01-02 3 5 0 11 -10 0.5 1 2020
3 2020-01-03 5 8 9998 61 -38 11.5 1 2020
4 2020-01-04 8 9998 0 33 -66 -16.5 1 2020
5 2020-01-05 5 10 0 33 -21 6 1 2020
6 2020-01-06 9998 9998 9998 33 -38 -2.5 1 2020
7 2020-01-07 9998 0 0 78 -10 34 1 2020
8 2020-01-08 5 9998 9998 44 -27 8.5 1 2020
9 2020-01-09 9998 9998 0 0 -55 -27.5 1 2020
10 2020-01-10 8 10 0 -10 -99 -54.5 1 2020
# ... with 177 more rows
现在这是我尝试使用 summarise 和 group_by 的原始代码:
## first format mso_light2$date from <chr> to an actual 'date'
install.packages("chron")
install.packages("openair")
install.packages("lubridate")
library("openair")
library("chron")
library('lubridate')
options(stringAsFactors = FALSE)
mso_light2$date <- as.Date(mso_light2$date, "%Y-%m-%d")
## Turning all daily temperatures into an average
mso_light2 <- mso_light2 %>% rowwise() %>%
mutate(TAVG = mean(c(TMAX, TMIN), na.rm = T))
## Composing daily data into monthly packages
mso_light2 <- mso_light2 %>%
mutate(month = month(date)) %>%
mutate(year = year(date))
## mso_PRCP <- mso_light2 %>%
## group_by(month, year) %>%
## summarise(PRCP = sum(PRCP))
## mso_SNOW <- mso_light2 %>%
## group_by(month, year) %>%
## summarise(SNOW = sum(SNOW))
## mso_TAVG <- mso_light2 %>%
## group_by(month, year) %>%
## summarise(TAVG = mean(TAVG))
## summarise(SNOW = sum(SNOW)) %>%
## summarise(TAVG = mean(TAVG))
问题是我不知道如何删除占位符“9999”和“9998”并将它们设为“0”。所以我一直在尝试开发一个 for 循环,这就是我所拥有的:
for(i in 1:length(mso_light2$year[[1]])){
startDate <- as.character(mso_light2$date[1])
startDate <- str_split(startDate, "-")
start_year <- startDate[[1]][1]
start_month <- startDate[[1]][2]
start_day <- startDate[[1]][3]
for(j in 1:length(mso_light2$month)){
mso_monthly <- sapply(mso_light2,
function(x) sum(x[["PRCP"]]),
use.names =
paste(start_year, '-',
start_month, sep = ""))
}
}
请忽略sapply() 我已经尝试了该系列中所有可能的功能,它们都返回错误消息。
这是我不断收到的错误:
FUN(X[[i]], ...) 中的错误:未使用的参数 (use.names = "2020-01")
sapply 只是我在寻求帮助之前尝试的最后一个函数,谢谢。
【问题讨论】:
-
能否请您发布一个数据的 sn-p 作为可重现的示例。使用
dput()或datapasta粘贴数据(理想情况下,整个示例可以是一个reprex,但让我们从数据开始)