2017-03-16 3 views
0

特定のディレクトリ内のすべてのファイルに次の機能を適用したいと考えています。次に、個々のファイルから処理されたデータを日時順の1つのマスターファイルに結合します。以下の関数は個々の個別のファイルを個別にクリーニングするのにはうまくいきますが、すべてをまとめて一度にマージしたいと思います。R関数を使用して個々のファイルを消去し、1つのマスターファイルに集約する

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)) 
} 

ここでは、raw dataの例を示します。

これは私が私のデータは、ディレクトリ内のすべてのファイルをクリーニングし、マージした後でもする形式です:

   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... 
+0

あなたのご意見ありがとうございます。 'full.names = TRUE'を変更すると、' list.files() '関数が正しく動作していました。 'ldply(filenames、clean.data)'も適切に動作していましたが、 '[order(datetime)]'は最初の行だけを含むデータフレームを出力します。代わりに、私は '%>%plyr :: arrange(import.list $ datetime)'を使いました。何らかの理由で 'plyr'だけがPOSIXct形式のdatetimesを順序付けることができるので、' dplyr :: arrange() 'の代わりに' plyr :: arange() 'を指定する必要があります。 – spacedSparking

関連する問題