2013-04-05 55 views
6

我是一位熱情的R新手,需要一些幫助! :)統計變量或變量組合的實例數量爲真

我有看起來像這樣的數據幀:

id<-c(100,200,300,400) 
a<-c(1,1,0,1) 
b<-c(1,0,1,0) 
c<-c(0,0,1,1) 

y=data.frame(id=id,a=a,b=b,c=c) 

ID是一個唯一標識符(例如人)和一個bÇ是虛設變量是否具有此功能(如始終爲1 = TRUE)。

我希望R創建一個矩陣或數據框,其中變量a,b和c都作爲列和行的名稱。對於矩陣R的值將必須計算具有此特徵的標識符的數量或特徵的組合。

因此,例如,ID爲100,200和400的矩陣的對角線上有一個特徵a,其中a和十字形R將輸入3.只有ID 100具有特徵a和b,因此R將輸入1 a和b交叉,等等。

產生的數據幀將不得不像這樣:

l<-c("","a","b","c") 
m<-c("a",3,1,1) 
n<-c("b",1,2,1) 
o<-c("c",1,1,2) 
result<-matrix(c(l,m,n,o),nrow=4,ncol=4) 

由於我的數據集有10個變量和數以百計的觀察,我會自動的全過程。

您的幫助將不勝感激。 非常感謝!

回答

8

隨着基礎R:

crossprod(as.matrix(y[,-1])) 
# a b c 
# a 3 1 1 
# b 1 2 1 
# c 1 1 2 
+0

+1我喜歡這樣的 – 2013-04-05 19:03:56

+0

感謝簡單而優雅的解決方案你非常喬希! – 2013-04-08 07:40:32

+0

@NikolayNenov - 沒問題。我總是欣賞一個具有可重現實例的良好公式化問題!如果我們的答案符合條例草案的要求,您可以通過點擊左邊的複選標記來「接受」其中一個(我似乎都可以接受)。 – 2013-04-08 12:36:16

3

這被稱爲鄰接矩陣。你可以用qdap包做到這一點很容易地:

library(qdap) 
adjmat(y[,-1])$adjacency 

## a b c 
## a 3 1 1 
## b 1 2 1 
## c 1 1 2 

它,因爲你餵養它一個數據幀拋出一個警告。沒什麼大不了的,可以忽略。也注意到我放棄了負號索引y[, -1]的第一列(ID)。

需要注意的是,因爲你有一個布爾矩陣開始時你可能會得到與有:

Y <- as.matrix(y[,-1]) 
t(Y) %*% Y