r - 在 .r 中按月聚合(汇总)多个时间序列数据
问题描述
我有数百个带有 .txt 扩展名的每日天气数据,逗号 (",") 作为常用文件夹中的分隔符。每个文件具有相同的数据结构,但文件名不同。以下是数据结构的示例:
$ year : int 1980 1980 1980 1980 1980 1980 1980 1980 1980 1980 ...
$ month : int 1 1 1 1 1 1 1 1 1 1 ...
$ day : int 1 2 3 4 5 6 7 8 9 10 ...
$ V1 : num 18.4 22.9 19.9 22.9 23.4 9.8 13.9 17.5 20.3 22.7 ...
$ V2 : num 30.8 31.5 31.4 31.3 31.5 29.8 30.1 30.6 30.5 31.1 ...
$ V3 : num 23.4 23.7 23.2 23.3 23.4 22.9 23 23.4 23.1 23.2 ...
$ V4 : num 2.2 0 0 0 0.9 3.6 3.5 3.7 1.2 0 ...
$ V5 : num 0.93 0.86 0.88 0.87 0.87 0.98 1 0.96 0.96 0.91 ...
$ V6 : num 1.6 3.5 5.2 5.5 3.9 4.2 4.2 4.9 4.9 4.4 ...
我需要对每个文件中的一个变量(比如说 V4)的总月度进行汇总。而每个文件想要的输出数据结构是这样的(第一列是年,第二列是月,第三列是V4每天的总和):
Year 1 Month 1 22.1
Year 1 Month 2 82.4
Year 1 Month 3 142.8
Year 1 Month …etc 314
Year 2 Month 1 48.9
Year 2 Month 2 173.6
Year 2 Month 3 76.2
Year 2 Month …etc 517.4
Year 3 Month 1 117.8
Year 3 Month 2 20.1
Year 3 Month 3 169.8
Year 3 Month …etc 191.5
然后我需要将结果导出为所有文件中的唯一 .txt 文件,新文件的名称根据每个文件的原始文件(例如:before_file1.txt 到 result_file1.txt)。我有一个使用 Purrr 的脚本,但似乎没有发生任何事情。请如果您愿意帮助我用正确的方法改进脚本。谢谢
# Load packages
library(tidyverse)
library(dplyr)
library(purrr)
# Setting working directory
workingdirectory <- "D:/Directory"
setwd(workingdirectory)
# Listing the files in the folder with .txt extension
FilesList <- list.files(workingdirectory, pattern = "\\.txt$", full.names = TRUE)
# Looping per files
purrr::map(FilesList, ~{
.x %>%
# Read csv file
read.csv(sep = ",", header = FALSE, stringsAsFactors = FALSE) %>%
# select variables
variables <- c("year", "month", "day", "V4") %>%
# summarize monthly of V4
group_by(month, year) %>%
summarise(monthly = sum(V4)) %>%
})
# Write the data back
write.csv(paste0('Result_', basename(.x)), sep = ",", row.names = FALSE)
我已经编辑了脚本,但是有一个错误。请帮助修复它。谢谢
Error: unexpected '}' in:
"
}"
>
> # Write the data back
> write.csv(paste0('TM_', basename(.x)), sep = ",", row.names = FALSE)
Error in basename(.x) : object '.x' not found
In addition: Warning message:
In write.csv(paste0("TM_", basename(.x)), sep = ",", row.names = FALSE) :
attempt to set 'sep' ignored
解决方案
我认为你已经在正确的方向。我建议的解决方法是在运行 purrr::map 函数之前定义函数。
因此,代码应如下所示:
# Load packages
library(tidyverse)
library(dplyr)
library(purrr)
# Setting working directory
workingdirectory <- "D:/Directory"
setwd(workingdirectory)
# Listing the files in the folder with .txt extension
FilesList <- list.files(workingdirectory, pattern = "\\.txt$", full.names = TRUE)
columnNames <- c("year", "month", "day", "pcp_day")
# define function
processing <- function(x){
x %>% read.csv(sep = "", header = FALSE, stringsAsFactors = FALSE) %>% rename_at(c(1,2,3,7), ~columnNames) %>% filter(month != 2 | day != 29) %>% group_by(month, year) %>% summarise(monthly = sum(pcp_day))
}
# Looping per files and # Write the data back
purrr::map(FilesList, ~processing(.x) %>% write.csv(paste0('Result_', basename(.x)), row.names = FALSE))
如果运行成功,您可以在您工作的工作目录中找到输出。
推荐阅读
- java - 如何将多种类型的用户重定向到各自的活动?
- javascript - 获取:错误类型错误:_this.props.saveFileInputAnswer 不是函数
- javascript - 如何检测在iframe javascript中点击了哪个元素
- java - Java:使用 HTTPUrlConnection 下载的 ZIP 文件已损坏
- php - 如何使用不是我的父主题的主题模板
- gcc - 在交叉编译 gcc binutils 和 glibc 之类的东西时如何使用 --with-cpu 和 --with-arch
- node.js - Node 只下载某些 url 的部分图片
- awk - 使用 awk 更改文件中第一列的值
- python - Dask 线程如何与 OpenBLAS/MKL/... 交互?
- sql - 字符串以字符结尾