8

applyを使用して行列の行全体を実行したいと思います。また、関数で現在の行の行名を使用したいと思います。rownames関数内でcolnames、、、dimnamesまたはnames直接使用することはできないようです。この質問の情報に基づいて、おそらく回避策を作成できることを認識しています。

applyしかし、私の質問は、最初の引数で配列の行名と列名をどのように処理するか、およびによって呼び出される関数内で作成されたオブジェクトへの名前の割り当てをどのように処理するapplyかです。次の例で示したいので、少し一貫性がないようです。このように設計された理由はありますか?

# Toy data
m <- matrix( runif(9) , nrow = 3 )
rownames(m) <- LETTERS[1:3]
colnames(m) <- letters[1:3]
m
          a         b           c
A 0.5092062 0.3786139 0.120436569
B 0.7563015 0.7127949 0.003358308
C 0.8794197 0.3059068 0.985197273

# These return NULL
apply( m , 1 , FUN = function(x){ rownames(x) } )
NULL
apply( m , 1 , FUN = function(x){ colnames(x) } )
NULL
apply( m , 1 , FUN = function(x){ dimnames(x) } )
NULL

# But...
apply( m , 1 , FUN = function(x){ names(x) } )
     A   B   C  
[1,] "a" "a" "a"
[2,] "b" "b" "b"
[3,] "c" "c" "c"
# This looks like a column-wise matrix of colnames, with the rownames of m as the column names to me

# And further you can get...
n <- apply( m , 1 , FUN = function(x){ names(x) } )
dimnames(n)
[[1]]
NULL

[[2]]
[1] "A" "B" "C"

# But you can't do...
apply( m , 1 , FUN = function(x){ n <- names(x); dimnames(n) } )
NULL

適用で内部的に何が起こるかを理解したいだけですか?どうもありがとう。

4

1 に答える 1

11

あなたの混乱は、でapply指定された関数に配列(または行列)を渡さないという事実から生じていると思いますFUN

行列の各行を順番に渡します。各行は、それ自体が(名前付きの)ベクトルの「唯一の」ものです。

> m[1,]
         a          b          c 
0.48768161 0.61447934 0.08718875 

したがって、関数にはこの名前付きベクトルのみが機能します。

あなたの真ん中の例については、に文書化されているようにapply

FUNへの各呼び出しが長さnのベクトルを返す場合、applyはn> 1の場合に次元c(n、dim(X)[MARGIN])の配列を返します。nが1の場合、applyはMARGINの長さが1の場合にベクトルを返します。それ以外の場合は、次元dim(X)[MARGIN]の配列。

したがってfunction(x) names(x)、各行に対して長さ3のベクトルを返すため、最終的な結果は表示される行列になります。しかし、その行列は、各行に個別に適用されapplyた結果に基づいて、関数の最後に作成されています。FUN

于 2013-03-05T16:45:01.050 に答える