2016-09-25 4 views
0
corr <- function(directory, threshold = 0) { 
    files_full<-list.files(directory, full.names=TRUE) 
    v<-vector() 
    for (i in 1:10) { 
    a <- (read.csv(files_full[i])) 
    b <- subset(a, (!is.na(a[,2])) & (!is.na(a[,3]))) 
    c <- length(b[ ,4]) 
    if (c > threshold) { 
     d <- cor(b[ ,2],b[ ,3]) 
    } else { 
     d <- vector(mode="numeric", length = 0) 
    } 
    v <- rbind(v, d) 
    } 
    v 
} 
cr <- corr("specdata", 0) 

私はディレクトリに.csvファイルのセットを持っており、それらを上記の関数の引数として渡したいと思っています。各ファイルについて、完全なケースの数を選択したいとし、その数が2番目の関数の引数で設定したしきい値より大きい場合、ファイルの2つのカラムに保持されている値の間に相関を生成したい3)。最終的な目的は、しきい値条件が満たされる各ファイルの相関の値を含むベクトルです。閾値条件が満たされない場合は、長さ0の数値ベクトルを返したい。R:ループ条件がついているのはなぜですか?

最初のファイルの完全なケースの数は117です。上記の関数は、しきい値がこの数を下回っている限り正常に機能します。私は、しきい値を設定した場合は> = 117関数は長さ0のベクトルを返します。そして、私は警告

In rbind(v, d) : 
    number of columns of result is not a multiple of vector length (arg 2) 

を取得するには文が完全な数の値に立ち往生されている場合には条件のように思えますループするのではなく、最初のファイルのケース。

私が間違っている場所を誰かが説明できると大変感謝しています!

答えて

2

rbindは、ベクトルまたは行列の行を結合するために使用されます。閾値> = 117の場合、dは長さゼロのベクトルです。長さゼロの行結合2つのベクトルは、2行0列の行列を与える(例えば、dim(rbind(vector(), vector()))を参照)。このゼロ列行列と非ゼロ長ベクトルを組み合わせるのは難しいです。それは警告が言うことです。

目的を達成するより良い方法は、各ファイルの相関を計算する関数を適用することです。長さゼロのベクトルを返す代わりに、NAを使用できます。

correlation_of_large_file <- function(file, threshold = 0) { 
    df <- read.csv(file) 
    if (nrow(df) > threshold) 
    cor(df[, 2], df[, 3]) 
    else 
    NA 
} 

files_full <- list.files("specdata", full.names = TRUE) 
vapply(files_full, correlation_of_large_file, numeric(1), threshold = 117) 
関連する問題