Как составить таблицу сопряженности для объединения нескольких пар переменных в R? - PullRequest
1 голос
/ 13 февраля 2020

У меня есть несколько двоичных переменных (1, 0), например, a1, a2, a3, a4. Я хотел бы сделать таблицу, объединяющую a1, a2, a3, a4 (как попарно), чтобы увидеть число «1» в любой паре переменных.

  a1 a2 a3 a4
1  1  0  1  0
2  0  0  1  0
3  1  1  0  0
4  1  1  1  0
5  0  1  0  1
6  1  0  1  0
7  0  0  1  1
structure(list(a1 = c(1, 0, 1, 1, 0, 1, 0), a2 = c(0, 0, 1, 1, 
1, 0, 0), a3 = c(1, 1, 0, 1, 0, 1, 1), a4 = c(0, 0, 0, 0, 1, 
0, 1)), class = "data.frame", row.names = c(NA, -7L))

Таблица - это нечто как показано ниже:

=="1"
     a1  a2  a3  a4
a1        2   3   0
a2   2        1   0
a3   3    1       1
a4   0    0   1   

Я трижды комбинировал, но он вернул несколько таблиц 2X2, объединяющих две переменные. Мне интересно, есть ли способ сделать стол, как указано выше? Спасибо.

Ответы [ 3 ]

5 голосов
/ 13 февраля 2020
apply(df,2,function(x){
  apply(df,2,function(y){
    sum(x==1 & y==1)
  })
})
   a1 a2 a3 a4
a1  4  2  3  0
a2  2  3  1  1
a3  3  1  5  1
a4  0  1  1  2

игнорирование диагонали или ее замена.

1 голос
/ 13 февраля 2020

Другая базовая опция R:

p <- rbind(data.frame(V1=names(DF), V2=names(DF)), 
    do.call(rbind, apply(DF, 1L, function(x) {
    y <- names(DF)[x==1L]
    if (length(y) > 1L) t(combn(y, 2L))
})))
ans <- table(p)
ans <- ans + t(ans)
diag(ans) <- 0
ans
1 голос
/ 13 февраля 2020

Одним из способов будет использование outer расчета количества единиц для каждой комбинации имен столбцов.

calculate_fun <- function(x, y) sum(df[x] == 1 & df[y] == 1)

mat <- outer(names(df), names(df), Vectorize(calculate_fun))
diag(mat) <- 0
dimnames(mat) <- list(names(df), names(df))
mat

#   a1 a2 a3 a4
#a1  0  2  3  0
#a2  2  0  1  1
#a3  3  1  0  1
#a4  0  1  1  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...