Подсчет пар элементов столбцов с одинаковым значением во фрейме данных и отображение в матричном формате - PullRequest
0 голосов
/ 11 июня 2018

Я искал в интернете подобное решение, но не смог найти конкретное для моего случая.Допустим, у вас есть следующий фрейм данных:

a = c(1, 1, 1, 2, 2)
b = c(2, 1, 1, 1, 2)
c = c(2, 2, 1, 1, 1)
d = c(1, 2, 2, 1, 1)
df <- data.frame(a = a, b = b, c = c, d = d)

и df выглядит следующим образом:

  a b c d
1 1 2 2 1
2 1 1 2 2
3 1 1 1 2
4 2 1 1 1
5 2 2 1 1

Примечание: В этом примере я использую [1,2] пара значений, но это может быть набор различных значений: [-1,1] или даже более двух возможных значений: [-1,1,2].

Теперь я хотел бы иметь матрицу, в которой каждый элемент [i,j]будет представлять количество строк со значением 1 для столбца i и j.Для этого конкретного случая мы имеем (показывая верхнюю диагональ, потому что она симметрична):

  a b c d
a 3 2 1 1
b   3 2 1
c     3 2
d       3

Диагональ должна подсчитывать количество строк со значением 1 в данном столбце.В этом случае все столбцы имеют одинаковый номер значения 1.Формат должен быть похож на функцию cor() (Матрица корреляции).

Я пытался использовать table() (а также crosstab из пакета descr), но он показывает информацию в виде пар столбцов,

Это можно сделать, вручную вычислив вхождение 1 каждой пары столбцов (то есть: nrow(df[df$a==1 & df$b==1,])=2) и затем поместив в матрицу, но мне было интересно, есть ли встроенная функциячто упростит процесс.

1 Ответ

0 голосов
/ 11 июня 2018

Мы можем использовать crossprod на matrix для вычисления вхождений значения 1 в примере вопроса:

m1 <- as.matrix(df == 1) # see Note[1]
out <- crossprod(m1)

Примечание [1] Указанный @imo (см. Комментарии ниже) для решения общего случая (матрица со значениями: [x,y]).Для матрицы с [0,1] значения df==1 можно заменить на df.Для подсчета значений 2 из примера вопроса используйте: df == 2.

Если нижняя диагональ должна быть 0 или NA

out[lower.tri(out)] <- NA
out
#   a  b  c d
#a  3  2  1 1
#b NA  3  2 1
#c NA NA  3 2
#d NA NA NA 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...