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は一意の識別子 (例: 人) であり、 ab、およびcは、その人がこの機能を持っているかどうかを表すダミー変数です (常に 1=TRUE)。

R に、変数 a、b、c を列と行の両方の名前として持つ行列またはデータ フレームを作成してもらいたいと思います。行列の値について、R は、この特徴を持つ識別子の数、または特徴の組み合わせを計算する必要があります。

したがって、たとえば、ID 100、200、および 400 は機能 a を持ち、マトリックスの対角線で a と a が交差している場合、R は 3 を入力します。ID 100 のみが機能 a と b の両方を持っているため、R は a と b の場合に 1 を入力します。クロスなど。

結果のデータ フレームは次のようになります。

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 に答える