2 つのベクトルを取り、数値を計算する関数があります (cor
相関のように)。ただし、約 6000 列の 2 つのデータセットがあり (2 つのデータセットの次元は同じです)、関数は相関値を含む 1 つのベクトルを返す必要があります。
ループを含むコードは次のようになります。
set.seed(123)
m=matrix(rnorm(9),ncol=3)
n=matrix(rnorm(9,10),ncol=3)
colNumber=dim(m)[2]
ReturnData=rep(NA,colNumber)
for (i in 1:colNumber){
ReturnData[i]=cor(m[,i],n[,i])
}
これは問題なく動作しますが、効率的な理由から、apply-family、明らかに mapply 関数を使用したいと考えています。
ただし、長さ 9 のs のmapply(cor,m,n)
ベクトルを返します。NA
> ReturnData
[1] 0.1247039 -0.9641188 0.5081204
編集/解決策
@akrun によって提供された解決策は、マトリックスの代わりにデータフレームを使用することでした。
さらに、提案された 2 つのソリューション間の速度テストでは、-mapply
バージョンが よりも高速であることが示されましたsapply
。
require(rbenchmark)
set.seed(123)
#initiate the two dataframes for the comparison
m=data.frame(matrix(rnorm(10^6),ncol=100))
n=data.frame(matrix(rnorm(10^6),ncol=100))
#indx is needed for the sapply function to get the column numbers
indx=seq_len(ncol(m))
benchmark(s1=mapply(cor, m,n), s2=sapply(indx, function(i) cor(m[,i], n[,i])), order="elapsed", replications=100)
#test replications elapsed relative user.self sys.self user.child sys.child
#2 s2 100 4.16 1.000 4.15 0 NA NA
#1 s1 100 4.33 1.041 4.32 0 NA NA