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是唯一标识符(例如人),而abc是人是否具有此功能的虚拟变量(始终为 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 个变量和数百个观察值,我将不得不自动化整个过程。

对你的帮助表示感谢。非常感谢!

4

2 回答 2

8

以 R 为底:

crossprod(as.matrix(y[,-1]))
#   a b c
# a 3 1 1
# b 1 2 1
# c 1 1 2
于 2013-04-05T17:30:55.573 回答
3

这称为邻接矩阵。您可以使用 qdap 包轻松完成此操作:

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

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

它会引发警告,因为您正在为其提供数据框。没什么大不了的,可以忽略。还注意到我删除了带有负索引的第一列(ID)y[, -1]

请注意,因为您从布尔矩阵开始,您可以通过以下方式到达那里:

Y <- as.matrix(y[,-1])
t(Y) %*% Y
于 2013-04-05T17:24:55.923 回答