R Использование функции для очистки отдельных файлов и последующего объединения в один главный файл.
Я хотел бы применить следующую функцию для каждого файла в данном каталоге. Затем я хочу объединить обработанные данные из каждого отдельного файла в один главный файл, упорядоченный по дате и времени. Приведенная ниже функция хорошо работает для очистки каждого отдельного файла в отдельности, но я бы хотел очистить и объединить все сразу.
clean.data <- function(fpath){
require(magrittr)
require(dplyr)
df <- read.csv(fpath, skip = 30, header = FALSE, stringsAsFactors = FALSE) ## the raw data has an unecessary 30 line header
colnames(df) <- c("date","time","value")
df$datetime <-strptime(paste(df$date, df$time), "%m/%d/%Y %H:%M:%S", tz = "UTC")
df$datetime <- as.POSIXct(df$datetime, format = dt_format, tz = "UTC")
df <- df[,-c(1:2)] ## remove redundant columns
df <- df[,c(2:1)] ## reorder so date-time is the first column
df %>%
group_by(datetime = cut(datetime, breaks = "1 min")) %>%
summarize(value = mean(value))
}
Вот пример необработанных данных.
Это формат, в котором я хочу, чтобы мои данные были после очистки и объединения всех файлов в каталоге:
datetime value
1 2017-03-02 16:25:00 1610
2 2017-03-02 16:26:00 862
3 2017-03-02 16:27:00 639
4 2017-03-02 16:28:00 563
5 2017-03-02 16:29:00 554
6 2017-03-02 16:30:00 558
Я думаю, что это должно сработать, но мне еще не повезло:
read.files <- function(fpaths, FUN, ...){
tbls <- lapply(fpaths, FUN, ...)
dta <- do.call(rbind, tbls)
return(dta)
}
read.files(fpaths, clean.data())
Комментарии и вопросы приветствуются, спасибо!
Решение:
filenames <- list.files(path = ".", pattern = "\\.txt$", all.files = FALSE, full.names = TRUE)
library(plyr)
library(magrittr)
import.list <- ldply(filenames, clean.data) %>% plyr::arrange(import.list$datetime) ## make sure to specify using plyr instead of dplyr!
1 ответ
Решение
Попробуйте это: начните со списка всех файлов, затем используйте ldply, чтобы применить вашу функцию ко всем файлам, и упорядочите получившийся фрейм данных:
filenames <- list.files(path = ".", pattern = "\\.txt$", all.files = FALSE, full.names = FALSE, recursive = FALSE, ignore.case = FALSE) #creates list of names of all .txt files in folder
#adjust this as appropriate for your files...
library(plyr)
import.list <- ldply (filenames, clean.data)[order(datetime),]
#I think you can do this in one line, but if a problem, can always create data frame with ldply first, then order...