我是一个热心的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个变量和数百个观察值,因此我必须自动完成整个过程。
非常感谢您的帮助。 非常感谢!
答案 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