计算变量或变量组合为TRUE的实例数

时间:2013-04-05 17:11:56

标签: r for-loop

我是一个热心的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 是唯一标识符(例如某人)和 a b c 是虚拟的该人是否具有此功能的变量(始终为1 = TRUE)。

我希望R创建一个矩阵或数据框,其中我将变量a,b和c都作为列和行的名称。对于矩阵的值,R必须计算具有此特征的标识符的数量或特征的组合。

因此,例如,ID 100,200和400在矩阵的对角线中具有a的特征,其中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个变量和数百个观察值,因此我必须自动完成整个过程。

非常感谢您的帮助。 非常感谢!

2 个答案:

答案 0 :(得分:8)

以基地R:

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

答案 1 :(得分: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