2

指標変数のマトリックスを作成したいと思います。私の最初の考えは、ここでも提案されていたmodel.matrixを使用することでした:因子水準ごとにR因子を1/0指標変数のコレクションに自動的に拡張する

ただし、因子にレベルが 1 つしかない場合、model.matrix は機能しないようです。

以下は、因子「地域」に 3 つのレベルを持つデータ セットの例です。

dat = read.table(text = "
    reg1    reg2    reg3   
      1       0       0
      1       0       0
      1       0       0
      1       0       0
      1       0       0
      1       0       0
      0       1       0
      0       1       0
      0       1       0
      0       0       1
      0       0       1
      0       0       1
      0       0       1
", sep = "", header = TRUE)

# model.matrix works if there are multiple regions:

region <- c(1,1,1,1,1,1,2,2,2,3,3,3,3)

df.region <- as.data.frame(region)

df.region$region <- as.factor(df.region$region)

my.matrix <- as.data.frame(model.matrix(~ -1 + df.region$region, df.region))
my.matrix


# The following for-loop works even if there is only one level to the factor
# (one region):

# region <- c(1,1,1,1,1,1,1,1,1,1,1,1,1)

my.matrix <- matrix(0, nrow=length(region), ncol=length(unique(region)))

for(i in 1:length(region)) {my.matrix[i,region[i]]=1}
my.matrix

for ループは効果的で、十分に単純に見えます。ただし、ループを含まない解決策を考え出すのに苦労しています。上記のループを使用できますが、それらから離れようと懸命に努力しています。より良い方法はありますか?

4

2 に答える 2

7

私はマトリックスインデックスを使用します。から?"[":

インデックス付けの 3 番目の形式は、各次元に 1 列の数値行列を使用するものです。インデックス行列の各行は配列の 1 つの要素を選択し、結果はベクトルになります。

その素晴らしい機能を利用する:

my.matrix <- matrix(0, nrow=length(region), ncol=length(unique(region)))
my.matrix[cbind(seq_along(region), region)] <- 1

#       [,1] [,2] [,3]
#  [1,]    1    0    0
#  [2,]    1    0    0
#  [3,]    1    0    0
#  [4,]    1    0    0
#  [5,]    1    0    0
#  [6,]    1    0    0
#  [7,]    0    1    0
#  [8,]    0    1    0
#  [9,]    0    1    0
# [10,]    0    0    1
# [11,]    0    0    1
# [12,]    0    0    1
# [13,]    0    0    1
于 2012-12-22T02:35:23.703 に答える
0

ここで同様の質問への回答を変更して、この解決策を思いつきました。

Rを使用してデータフレームの列を複数の列に再形成する

region <- c(1,1,1,1,1,1,2,2,2,3,3,3,3)
site <- seq(1:length(region))
df <- cbind(site, region)
ind <- xtabs( ~ site + region, df)
ind

region <- c(1,1,1,1,1,1,1,1,1,1,1,1,1)
site <- seq(1:length(region))
df <- cbind(site, region)
ind <- xtabs( ~ site + region, df)
ind

編集:

以下の行は、から指標変数のデータ フレームを抽出しますind

ind.matrix <- as.data.frame.matrix(ind)
于 2012-12-25T13:41:26.653 に答える