2017-10-27 8 views
0

この適用が正しく機能しない理由を誰かが説明できますか?私は、各行のすべての値を各行の値の合計で正規化したかったので、各行の合計= 1でした。しかし、これを適用関数を使って実行した場合、答えは正しくありません。R適用とループ計算

data <- data.frame(Sample=c("A","B","C"),val1=c(1235,34567,234346),val2=c(3445,23446,234235),val3=c(457643,234567,754234)) 

norm <- function(x){ 
    x/sum(x)} 

applymeth <- data 
applymeth[,2:4] <- apply(applymeth[,2:4], 1, norm) 
rowSums(applymeth[,2:4]) 

loopmeth <- data 
for(i in 1:nrow(data)){ 
    loopmeth[i,2:4] <- norm(loopmeth[i,2:4]) 
} 
rowSums(loopmeth[,2:4]) 

ありがとうございます。

+0

'apply()'は、行単位の入力から、あなたのケースでは(結果として)行列の列を列で与えます。 – jogo

+0

ありがとうございます - それは混乱しています! – Harry

答えて

1

apply()(結果として)行ごとの入力から、あなたのケースでは、マトリックスの列を列で表示します。あなたは結果を転置する必要があります。
マトリックス中 または多次元配列最初のインデックス:

applymeth <- data 
applymeth[,2:4] <- t(apply(applymeth[,2:4], 1, norm)) 
rowSums(applymeth[,2:4]) 

apply()のこの結果の理由は慣例である

apply(matrix(1:12, 3), 1, norm) 

を見てくださいディメンションは最初に実行され、次に2番目に実行されます。例:(データの再編成せず)が

array(1:12, dim=c(2,2,3)) 

apply()は次々に列を生成します。この動作はではなく、は、apply()のパラメータMARGIN=に依存します。

+0

ありがとう!このように出力を与える論理的な理由はありますか? – Harry

+0

私は私の答えにいくつかの発言を書いた。 – jogo