r - 创建一个循环以将遇到的数据下载并写入 csv
问题描述
我在使用 R 方面是个新手,但我正在尝试自学和学习。我正在尝试创建一个循环,以使用 worldmet 包将多个气象数据文件单独下载并保存为 csv 文件。
我有两个变量,遇到的站点代码和感兴趣的年份。我已经包含了创建相关年份列表的代码:
Startyear <- "2018"
Endyear <- "2020"
Yearlist <- seq(as.numeric(Startyear), as.numeric(Endyear))
我有一个 .csv 文件,其中列出了所有必需的站点代码,并将其读入 R。请参见下面的数据框的简化版本,但总共有 204 行。该数据框称为“siteinfo”。
code station ctry
037760-99999 GATWICK UK
037690-99999 CHARLWOOD UK
038760-99999 SHOREHAM UK
038820-99999 HERSTMONCEUX WEST END UK
037810-99999 BIGGIN HILL UK
为一个站点导入一年价值的元数据的代码示例如下
importNOAA(code="037760-99999",year=2019,hourly=TRUE,precip=FALSE,PWC=FALSE,parallel=FALSE,quiet=FALSE)
我知道我可能需要一个嵌套循环来更改这两个变量,但我不确定我是否正确地处理了这个。我也知道我需要在代码值周围加上引号才能正确读取它,但是我想知道是否有一种快速的方法可以将其作为代码的一部分而不是编辑 csv 中的所有 204 值?
下载文件后我还需要一个单独的循环,还是可以将其包含在一段代码中?
我拥有的当前代码,我确信这有很多问题,所以我很感激任何指导,如下
for(i in 1:siteinfo$code) {
for(j in 1:Yearlist){
importNOAA(code=i,year=j,hourly = TRUE, precip= FALSE, PWC= FALSE, parallel = TRUE, quiet = FALSE)
}}
这目前不起作用,所以如果你能帮我把它拼凑起来,如果可能的话,提供任何关于我哪里出错或如何改进我的编码的解释,我将非常感激!
解决方案
您可以使用 和 中的某些函数完全避免循环(对于大型数据集和文件更好dplyr
)purrr
。当我尝试运行您的importNOAA
代码时,出现无效参数错误,因此我使用了对该函数的更简单调用。
met_data <- siteinfo %>%
full_join(data.frame(year = Yearlist), by = character(0)) %>%
group_by(code, year) %>%
mutate(dat = list(data.frame(code, year))) %>%
mutate(met = purrr::map(dat, function(df) {
importNOAA(code = df$code, year = df$year, hourly=TRUE, quiet=FALSE)
}) ) %>%
select(-dat)
此代码返回一个 tbl.df,其中最后一列是 data.frames 的列表,每个包含年份代码组合的数据。您可以使用met_data %>% summarize(met)
将数据扩展为一个大 data.frame 以保存到 csv,或者如果您想将它们全部写入单个 csv,请使用 lapply:
lapply(1:nrow(met_data), function(x) {
write.csv(met_data$met[x],
file = paste(met_data$station[x], "_", met_data$year[x], ".csv", sep = ""))})
推荐阅读
- python - 计算角度的更有效方法?
- pine-script - 如何在真实交易中应用 pine 脚本策略?
- r - 在 R 中的数据框中创建 4 到 7 位数字的序列唯一 ID
- python - Yolo 对象检测和元数据
- java - 需要帮助 - 如何访问特定的 ODT 文件并进行所需的操作
- react-native - 如何在 React Native Navigation 中管理重叠栏和抽屉
- windows - powershell:删除以前在脚本中用作参数的文件
- vue.js - 如何通过Vue Router直接在prop中传递对象?
- laravel-backpack - 背包 laravel 侧边栏问题
- xslt - 在动态处理 xslt 时将数据保存到地图