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...
Другие вопросы по тегам