私は次のデータフレームを持っています
id channel
1 a
1 b
1 c
2 a
2 c
3 a
マトリックスを作成してオーバーラップしたいと思います。これは基本的に、行と列のラベルがa、b、cである正方行列であり、そのテーブルの各エントリは、各チャネルに共通するIDの数を示しています。たとえば、上記の例では、マトリックスは次のようになります。
a b c
a 3 1 2
b 1 1 1
c 2 1 2
よろしくお願いします。
私は次のデータフレームを持っています
id channel
1 a
1 b
1 c
2 a
2 c
3 a
マトリックスを作成してオーバーラップしたいと思います。これは基本的に、行と列のラベルがa、b、cである正方行列であり、そのテーブルの各エントリは、各チャネルに共通するIDの数を示しています。たとえば、上記の例では、マトリックスは次のようになります。
a b c
a 3 1 2
b 1 1 1
c 2 1 2
よろしくお願いします。
これでうまくいくはずです:
df <- data.frame(id=c(1,1,1,2,2,3), channel=letters[c(1,2,3,1,3,1)]) # your data
m <- table(df[[1]], df[[2]]) ## Alternatively: m <- do.call(table, df)
t(m) %*% m
# a b c
# a 3 1 2
# b 1 1 1
# c 2 1 2
library(plyr)
df
id channel
1 1 a
2 1 b
3 1 c
4 2 a
5 2 c
6 3 a
tb <- table(ddply(df, .(id), function(x) {x$id <- x$channel; expand.grid(x)}))
tb
channel
id a b c
a 3 1 2
b 1 1 1
c 2 1 2
names(dimnames(tb)) <- NULL
tb
a b c
a 3 1 2
b 1 1 1
c 2 1 2
ここで、の出力としての行列テーブルに関するいくつかの説明と何かtable()
。に例があります?table
a <- letters[1:3]
(b <- sample(a))
[1] "b" "c" "a"
table(a, b)
b
a a b c
a 0 1 0
b 0 0 1
c 1 0 0
したがって、位置によって要素と一致します。
id channel
1 a
1 b
1 c
2 a
...
次にid
、データフレームをで分割し、列id
のコピーを作成し、channel
これら2つの列のすべての組み合わせを取得することで、同じことを共有することができます。
tbl <- expand.grid(data.frame(x = c("a","b","c"), y = c("a", "b", "c")))
tbl
x y
1 a a
2 b a
3 c a
4 a b
5 b b
6 c b
7 a c
8 b c
9 c c
table(tbl$x, tbl$y)
a b c
a 1 1 1
b 1 1 1
c 1 1 1