Агрегировать (суммировать) данные нескольких временных рядов по месяцам в .r - PullRequest
0 голосов
/ 28 мая 2020

У меня есть сотни ежедневных данных о погоде с расширением .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

1 Ответ

1 голос
/ 30 мая 2020

Думаю, ты уже в правильном направлении. Мое предложенное обходное решение - определить функцию до запуска функции 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))

При успешном выполнении вы можете найти выходы в рабочем каталоге, в котором вы работаете.

...