Подсчет пар элементов столбца, но удаление повторяющихся значений - PullRequest
0 голосов
/ 11 июля 2020

У меня есть набор данных с данными событий в формате ниже

> order_df
# A tibble: 10 x 4
       H     M     B    FB
   <int> <dbl> <dbl> <dbl>
 1     1     1     0     0
 2     1     1     0     0
 3     1     0     1     0
 4     1     0     0     1
 5     0     1     0     0
 6     0     0     0     0
 7     0     1     1     1
 8     0     0     1     0
 9     0     1     0     0
10     0     0     0     0

Я хотел бы показать его как пары матриц, чего я могу достичь с помощью приведенного ниже кода

> order_matrix = as.matrix(order_df)
> pair_matrix <- crossprod(order_matrix)
> pair_matrix
   H M B FB
H  4 2 1  1
M  2 5 1  1
B  1 1 3  1
FB 1 1 1  2

Однако экземпляры пары (например, M: M) включают все строки из исходного фрейма данных, которые включают этот столбец, но я бы хотел, чтобы это значение включало только тот экземпляр, где исходная строка фрейма данных включала ТОЛЬКО 1 в столбец .

В приведенном выше примере я бы хотел, чтобы пара H: H была равна 0, так как все экземпляры с H включали еще один столбец. пара M: M будет 1, так как только 1 экземпляр включает только M

1 Ответ

0 голосов
/ 11 июля 2020

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

Вы также говорите в своем вопросе, что M должен быть 1, поскольку он появляется сам по себе только один раз. На самом деле он появляется сам по себе дважды (строка 5 и строка 9).

Вы можете получить нужный результат, удалив все строки с суммой строк более одной, а затем взяв суммы столбцов:

colSums(as.matrix(order_df[rowSums(order_df) == 1,]))
#>  H  M  B FB 
#>  0  2  1  0 

и если вы внимательно проверите, это правильно.

Если вам действительно нужен результат в матрице, просто удалите строки с более чем одним значением и возьмите перекрестное произведение этого:

crossprod(as.matrix(order_df[rowSums(order_df) == 1,]))
#>    H M B FB
#> H  0 0 0  0
#> M  0 2 0  0
#> B  0 0 1  0
#> FB 0 0 0  0
...