2016-04-24 21 views
2

このトピックのさまざまなスレッドでヘルプを検索した後、私はまだ賢くなっていません。したがって、複数のデータファイルをループする際の別の質問があります。複数のcsvからデータフレームまでの平均値

OK。私は1つのフォルダに5列のデータを含む複数のCSVファイルを持っています。以下のようにファイル名は以下のとおりです。

モイストYYYYMMDD hh_mm_ss.csv

私は、次の手順やって1によりプロセスCSV-ファイル1を読み込み、スクリプトを作成したいと思います:

1)ロード・ファイル を2)列数を確認し、3回未満の登録がある場合はファイルを除外します 3)列2のすべての測定値(=行)の平均値を計算します 4)列4のすべての測定値(=行)の平均値を計算します。 5)ファイル名タイムスタンプ、平均コラム2、平均コラム4からデータフレームへ

私は次の関数に

moist.each.mean <- function() { 
    library("tcltk") 
    directory <- tk_choose.dir("","Choose folder for Humidity data files") 
    setwd(directory) 
    filelist <- list.files(path = directory) 
    filetitles <- regmatches(filelist, regexpr("[0-9].*[0-9]", filelist)) 
    mdf <- data.frame(timestamp=character(), humidity=numeric(), temp=numeric()) 

    for(i in 1:length(filelist)){ 
    file.in[[i]] <- read.csv(filelist[i], header=F) 
    if (nrow(file.in[[i]]<3)){ 
     print("discard") 
    } else { 
     newrow <- c(filetitles[[i]], round(mean(file.in[[i]]$V2),1), round(mean(file.in[[i]]$V4),1)) 
     mdf <- rbind(mdf, newrow) 
    } 
    } 
    names(mdf) <- c("timestamp", "humidity", "temp") 
} 

を書かれているが、私はエラーを取得しておいてください。

Error in `[[<-.data.frame`(`*tmp*`, i, value = list(V1 = c(10519949L, : 
    replacement has 18 rows, data has 17 

任意のアイデア?

Thxを、kruemelprinz

+0

ここで 'file.in'は定義されていますか? –

+0

残念ながら、それを定義する方法はわかりません。私はすでにこれまでに苦労しました... file.inは、処理される次のファイルによって上書きされるまで、特定のCSVで読み込むための一時的なオブジェクトであることを意図しています。 – kruemelprinz

答えて

0

私も(L)を使用することをお勧めしたい適用されます...ここに私のテイクです:< F

getMeans <- function(fpath,runfct, 
       target_cols = c(2), 
       sep=",", 
       dec=".", 
       header = T, 
       min_obs_threshold = 3){ 

- list.files (FPATH) fcsv < - F [grepl( "\ CSV"、F)]

fcsv <- paste0(fpath,fcsv) 

csv_list <- lapply(fcsv,read.table,sep = sep, 
       dec = dec, header = header) 

csv_rows <- sapply(csv_list,nrow) 

rel_csv_list <- csv_list[!(csv_rows < min_obs_threshold)] 

lapply(rel_csv_list,function(x) colMeans(x[,target_cols])) 


} 

はまた、エラーメッセージのようなもので、デバッガは非常に役に立つかもしれません。 debug(moist.each.mean)を実行して、この機能を段階的に実行してください。

0

は、ここで少し異なるアプローチです。 lapplyを使用して各csvファイルを読み込み、必要に応じて除外します。そうでない場合は要約を作成します。これは、各要素がデータフレームサマリーであるリストを提供します。次に、rbindを使用して、最終要約データフレームを作成します。

データのサンプルがないと、以下のコードがあなたの問題と正確に一致することは確かではありませんが、行きたいところに行くのに十分です。あなたの元のコードと

# Get vector of filenames to read 
filelist=list.files(path=directory, pattern="csv") 

# Read all the csv files into a list and create summaries 
df.list = lapply(filelist, function(f) { 

    file.in = read.csv(f, header=TRUE, stringsAsFactors=FALSE) 

    # Set to empty data frame if file has less than 3 rows of data 
    if (nrow(file.in) < 3) { 

    print(paste("Discard", f)) 

    # Otherwise, capture file timestamp and summarise data frame 
    } else { 

    data.frame(timestamp=substr(f, 7, 22), 
       humidity=round(mean(file.in$V2),1), 
       temp=round(mean(file.in$V4),1)) 
    } 
}) 

# Bind list into final summary data frame (excluding the list elements 
# that don't contain a data frame because they didn't have enough rows 
# to be included in the summary) 
result = do.call(rbind, df.list[sapply(df.list, is.data.frame)]) 

1つの問題は、あなたが要約結果のベクトルではなく、結果のデータフレームを作成することです:

c(filetitles[[i]], round(mean(file.in[[i]]$V2),1), round(mean(file.in[[i]]$V4),1))は、3つの要素を持つベクトルです。あなたが実際にしたいことは3つの列を持つデータフレームである:

data.frame(timestamp=filetitles[[i]], 
      humidity=round(mean(file.in[[i]]$V2),1), 
      temp=round(mean(file.in[[i]]$V4),1)) 
0

lapplyを使用していただきありがとうございます。これは、コード全体を節約するので、間違いなく価値があります!一方で、私も私の元のコードを修正するために管理:

library("tcltk") 
# directory: path to csv files 
directory <- 
    tk_choose.dir("","Choose folder for Humidity data files") 
setwd(directory) 
filelist <- list.files(path = directory) 
filetitles <- 
    regmatches(filelist, regexpr("[0-9].*[0-9]", filelist)) 
mdf <- data.frame() 

for (i in 1:length(filelist)) { 
    file.in <- read.csv(filelist[i], header = F, skipNul = T) 
    if (nrow(file.in) < 3) { 
    print("discard") 
    } else { 
    newrow <- 
     matrix(
     c(filetitles[[i]], round(mean(file.in$V2, na.rm=T),1), round(mean(file.in$V4, na.rm=T),1)), nrow = 1, ncol = 
      3, byrow = T 
    ) 
    mdf <- rbind(mdf, newrow) 
    } 
} 

names(mdf) <- c("timestamp", "humidity", "temp") 

のみ私は、私は一列のみを持っているでしょうので、それは最後のファイルデータを含むmdfに関数として動作するように取得できませんでした。何とか行を追加するのではなく、行1を各反復で上書きします。しかし、関数ラッパーなしでそれを使用すると正常に動作しました...

関連する問題