2013-04-05 52 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