6

私は R のチュートリアルを進めていて、これらの関数のいずれかを使用する必要があるのではないかと疑っていますが、どれを使用するかはわかりません (はい、それらを調査しましたが、R の用語に慣れるまでは非常に混乱します)。

私の作業ディレクトリには、「specdata」フォルダがあります。Specdata には、001.csv ~ 300.csv という名前の数百の CSV ファイルが含まれています。

私が取り組んでいる関数は、入力された数の csv ファイルの行の総数をカウントする必要があります。したがって、関数の引数が で、1:10これらの各ファイルに 10 行ある場合は、100 を返します。

これが私がこれまでに持っているものです:

complete <- function(directory,id = 1:332) {
    setpath <- paste("/Users/gcameron/Desktop",directory,sep="/")
    setwd(setpath)
    csvfile <- sprintf("%03d.csv", id)
    file <- read.csv(csvfile)
    nrow(file)
 }

これは、ID 引数が 1 つの数字、たとえば 17 の場合に機能します。しかし、引数として 10:50 と入力すると、エラーが発生します。

Error in file(file, "rt") : invalid 'description' argument

入力された ID パラメータから総行数をカウントできるようにするにはどうすればよいですか?

4

4 に答える 4

9

read.csvは 1 つのファイルのみを読み取ることを想定しているため、ファイルをループする必要があります。これを行う R の慣用的な方法は、次を使用することsapplyです。

nrows <- sapply( csvfile, function(f) nrow(read.csv(f)) )
sum(nrows)

たとえば、complete関数の書き直しは次のとおりです。

complete <- function(directory,id = 1:332) {
    csvfiles <- sprintf("/Users/gcameron/Desktop/%s/%03d.csv", directory, id)
    nrows <- sapply( csvfiles, function(f) nrow(read.csv(f)) )
    sum(nrows)
}
于 2013-01-16T12:44:31.400 に答える
1

宿題の問題は通常、そのようにタグ付けされますが、それが必要かどうかはわかりませんが、これは明らかに宿題です。

記述されている関数は、id がベクトルではないことを想定しています (デフォルト値は整数のベクトルであるにもかかわらず)。

*apply 関数 (より簡潔で一般的) のいずれかを使用するか、明示的なループを使用するように変更します。id ベクトルの各要素に対して、そのファイルを開いて観測をカウントする関数を呼び出さなければなりません。

このスタックオーバーフローの投稿には、 *apply 関数の違いがよく説明されています。

于 2013-01-16T12:47:47.307 に答える