2

繰り返し発生する問題のように思われるため、一般的な方法で質問したい非常に単純な質問です。一般的な方法を見つけていただければ幸いです。問題は、たとえば、論理行列を因子の行列に変換することですが、行列構造を維持します: 行と列の数、列名、行名。よりも簡単なものが欲しい

X2 <- matrix(as.mode(X), ncol=ncol(X)); 
rownames(X2) <- rownames(X) ...

いくつかのケースについては、すでにこの問題を把握しているので、ここに記載しますが、いくつかの質問が残っています...

A. (-->) 要因への変換は、私には簡単な方法がありません。

B. 1. 論理 --> 数値: 「+0」トリックを使用

BoolMatrix <- matrix(c(TRUE,FALSE),nrow=3,ncol=2)
rownames(BoolMatrix) <- LETTERS[1:3]; colnames(BoolMatrix) <-LETTERS[11:12]
(NumMatrix <- BoolMatrix + 0)   

B. 2. 数値 --> 論理: 条件を直接使用

NumMatrix <- matrix(1:6, ncol=2)
rownames(NumMatrix) <- LETTERS[1:3]; colnames(NumMatrix) <-LETTERS[11:12]
(BoolMatrix <- NumMatrix == 0) 

C. 数値 <--> 文字: 2 ライナーよりもうまくいくことはありません。モードを直接変更すると機能します (また、論理と数値の間でも機能しますが、上記のソリューションはよりエレガントです)

CharMatrix <- NumMatrix
mode(CharMatrix) <-"character"
print(CharMatrix)

最後の解決策(「2ライナー」)は、実際には、私が苦労している要因に関係のないものに対して機能します...

何か案が ?:-)

4

3 に答える 3

5

structure属性のリストを任意のオブジェクトにアタッチする を使用します。マトリックスの場合、必要な属性はdimと、オプションでdimnamesです。

たとえばX、因子の行列への変換:

m <- structure(factor(X), dim=dim(X), dimnames=dimnames(X))
于 2013-08-06T04:36:48.673 に答える
2

@HongOoi の優れた回答に基づいて、すべてattributesの入力行列 (次元と次元名を含む) を保持し、データを目的のmodeまたは ,numeric modeに変更する関数を次に示しますfactor class

change.mat <- function(X,ch.fun) {
  do.call(structure,c(list(.Data=do.call(ch.fun,list(X))),attributes(X)))
}

例:

change.mat(NumMatrix,factor)
#  K L
#A 1 4
#B 2 5
#C 3 6
#Levels: 1 2 3 4 5 6

change.mat(NumMatrix,as.character)
#  K   L  
#A "1" "4"
#B "2" "5"
#C "3" "6"

change.mat(BoolMatrix,as.numeric)
#  K L
#A 1 0
#B 0 1
#C 1 0
于 2013-08-06T04:25:35.673 に答える