2012-12-22 128 views
1

我想創建一個指標變量矩陣。我最初的想法是使用model.matrix,這也是在這裏建議的:Automatically expanding an R factor into a collection of 1/0 indicator variables for every factor level創建指標變量矩陣

但是,model.matrix似乎不工作,如果一個因素只有一個級別。

下面是一個例子的數據與三個級別的因子「區域」設置:

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

我會使用矩陣索引。從?"["

索引的第三種形式是通過與每個維的一列的數字矩陣:索引矩陣的各行則選擇所述陣列的單個元件,其結果是一個矢量。

利用那該多好特點:

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 
+0

+1任何人任何時候誰使用名不見經傳的但非常酷的矩陣索引功能。這是我的最愛。 – Aaron

+0

我認爲雖然'長度(獨特(區域))'應該是'nlevels(region)';如果缺少一個級別,矩陣將不夠寬。 – Aaron

+0

@Aaron,我從OP複製的第一行。看看'region'是如何定義的;這不是一個因素,所以我認爲'長度(唯一(區域))'是適當的。 – flodel

0

我想出了這個解決方案通過修改回答類似的問題在這裏:

Reshaping a column from a data frame into several columns using 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)