0

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
4

1 に答える 1

1

データセットはmatrixであるため、mapplyは各列ではなく各要素をループします。それを避けるには、データフレームに変換します。これが大きなデータセットに対してどれほど効率的かはわかりません。

mapply(cor, as.data.frame(m), as.data.frame(n))
#     V1         V2         V3 
#0.1247039 -0.9641188  0.5081204 

別のオプションは、sapplyに変換せずに使用することですdata.frame

 indx <- seq_len(ncol(m))
 sapply(indx, function(i) cor(m[,i], n[,i]))
 #[1]  0.1247039 -0.9641188  0.5081204
于 2014-10-24T09:12:59.007 に答える