2

私はRプログラミングが初めてで、これを行うためにループを書くことができることを知っていますが、私が読んだすべてのことは、単純化のためにループを避け、代わりに適用を使用するのが最善であると言っています.

マトリックスがあり、マトリックスの各要素でこの関数を実行したいと思います。

cellresidue <- function(i,j){
  result <- (cluster[i,j] - cluster.I[i,] - cluster.J[j,] - cluster.IJ)/(cluster.N*cluster.M)
  return (result)
}

i= element row
j= element column
cluster.J is a matrix of column means
cluster.I is a matrix of row means
cluster.IJ is the mean of the entire matrix named cluster

私が理解できないのは、mapply が動作している要素の行と列を取得する方法 (row() および column col() 関数を使用する必要があると思います) と、それらの引数を mapply または apply に渡す方法です。

4

2 に答える 2

0

*applyループや関数は必要ありません。単純な行列演算を使用できます。

nI <- nrows(cluster)
nJ <- ncols(cluster)
cluster.I  <- matrix(rowMeans(cluster), nI, nJ, byrow = FALSE)
cluster.J  <- matrix(rowMeans(cluster), nI, nJ, byrow = TRUE)
cluster.IJ <- matrix(    mean(cluster), nI, nJ)

residue.mat <- (cluster - cluster.I - cluster.J - cluster.IJ) /
               (cluster.N * cluster.M)

(あなたはcluster.Ncluster.Mが何であるかを説明しませんでしたが、それらはスカラーであると仮定します)

于 2013-11-23T01:39:07.930 に答える
0

あなたが何をしようとしているのか、あなたの質問からは明らかではありません。このサイトでは、いくつかのモック データ (できればコードによって生成され、貼り付けられたものではない) を提供し、最終結果がどのような形になるかを示すのが最善です。apply家族はあなたが求めているものではないようです。

apply、sapply、mapply のあいまいさを素早く解消:

#providing data for examples
X=matrix(rnorm(9),3,3)

apply : 関数を行列または配列の列 (2) または行 (1) に適用します

#here, sum by columns, same as colSums(X)
apply(X, 2, sum)

sapply : (通常は) オブジェクトのリストに対して関数を適用します

#create a list with three vectors
mylist=list(1:4, 5:10, c(1,1,1))
#get the mean of each vector
sapply(mylist, mean)

#remove 2 to each element of X, same as c(X-2)
sapply(X, FUN=function(x) x-2)

mapply : sapply の多変量バージョンで、任意の数の引数を取ります。あまり使用したことがありませんでした…いくつかの岩底の例:

#same as c(1,2,3,4) + c(15,16,17,18)
mapply(sum, 1:4, 15:18)

#same as c(X+X), the vectorized matrix sum
mapply(sum, X, X)

補足: R でループを使用しても問題ありません。あなたの考えに最も適したものを使用してください。問題は、反復回数が「非常に多い」場合、忍耐力によっては、ここでボトルネックが発生する可能性があることです。これには 2 つの解決策があります。関数を C/FORTRAN で書き直す (そして速度を上げる) か、該当する場合は組み込み関数を使用します (ちなみに、C または FORTRAN で書かれていることが多い)。

于 2013-11-23T02:22:26.477 に答える