5

行列から列を抽出するためのR構文があり、返されるベクトルに常にname属性がないかどうかを知りたいです(この動作に依存したいと思います)。

私の問題は、次の矛盾です。

  • 行列に複数の行があり、そうすると、名前属性のないmyMatrix[, 1]の最初の列が取得されます。myMatrixこれが私が欲しいものです。
  • 行列に1行だけがあり、そうするとmyMatrix[, 1]、の最初の列が取得さmyMatrix れますが、名前として最初の列名があります。

名前のないものをmyMatrix[, 1]一貫し手に入れたいです。

これを示す例:

# make a matrix with more than one row,
x <- matrix(1:2, nrow=2)
colnames(x) <- 'foo'
#      foo
# [1,]   1
# [2,]   2

# extract first column. Note no 'foo' name is attached.
x[, 1]
# [1] 1 2

# now suppose x has just one row (and is a matrix)
x <- x[1, , drop=F]
# extract first column
x[, 1]
# foo    # <-- we keep the name!!
#   1

さて、[?'[')のドキュメントにはこの動作が記載されているので、バグなどではありません(ただし、なぜですか?!なぜこの不整合?!):

行列のインデックス付けによって取得されたベクトルは、結果の名前を提供するために行名(存在する場合)にインデックスが付けられるときに「x」が1次元でない限り、名前が付けられません。

私の質問はx[, 1]、結果が 常に名前なしになるようにする方法はありxますか?行列はどこにありますか?

私の唯一の希望ですか、それともの議論unname(x[, 1])に類似したものがありますか?または、「常に名前を付けない」と言うように設定できるオプションはありますか?私が使用できるいくつかのトリック(抽出された結果がベクトルである場合、どういうわけかの動作をオーバーライドしますか?)[drop[

4

1 に答える 1

1

以下のコードが機能する理由を更新してください(私が知る限り)

のサブセット[化は、のRソースファイルsubset.cに含まれる関数を使用して処理されます~/src/main。マトリックスインデックスを使用してマトリックスをサブセット化する場合、関数VectorSubsetが呼び出されます。複数のインデックスが使用されている場合(つまり、のように行と列にそれぞれ1つずつx[,1])、MatrixSubsetが呼び出されます。

この関数VectorSubsetは、サブセット化されている1次元配列にのみ名前を割り当てます。行列は2次元配列であるため、行列のインデックスを使用する場合、結果に名前は割り当てられません。ただし、この関数MatrixSubsetは、特定の状況下でdimnamesを渡そうとします。


したがって、ヘルプページからの引用で参照しているマトリックスインデックスが重要であるように思われます。

x <- matrix(1)
colnames(x) <- "foo"
x[, 1]  ## 'Normal' indexing
# foo 
#   1 
x[matrix(c(1, 1), ncol = 2)]  ## Matrix indexing
# [1] 1

そして、より広い1行のマトリックスを使用します。

xx <- matrix(1:10, nrow = 1)
colnames(xx) <- sprintf('foo%i', seq_len(ncol(xx)))
xx[, 6]  ## 'Normal' indexing
# foo6 
#    6 
xx[matrix(c(1, 6), ncol = 2)]  ## Matrix indexing
# [1] 6

両方の次元が1より大きい行列の場合

yy <- matrix(1:10, nrow = 2, dimnames = list(NULL,
  sprintf('foo%i', 1:5)))

yy[cbind(seq_len(nrow(yy)), 3)]  ## Matrix indexing
# [1] 5 6
于 2013-03-05T08:33:19.133 に答える