首页 > 解决方案 > 总结一个逻辑矩阵

问题描述

我有一个大矩阵,每列下都填充了真/假值。有没有办法可以总结矩阵,以便每一行都是唯一的,并且我有一个新列,其中包含该行出现频率的总和。

例子:

    A B C D E
[1] T F F T F
[2] T T T F F
[3] T F F T T
[4] T T T F F
[5] T F F T F

会成为:

    A B C D E total
[1] T F F T F  2
[2] T T T F F  2
[3] T F F T F  1

编辑

我将这个矩阵与一个新列rev绑定,所以我现在有一个看起来像的 data.frame

    A B C D E rev
[1] T F F T F  2
[2] T T T F F  3
[3] T F F T T  5
[4] T T T F F  2
[5] T F F T F  1

并且想要一个 data.frame 也将 rev 列汇总如下:

    A B C D E rev total
[1] T F F T F  3    2
[2] T T T F F  5    2 
[3] T F F T T  5    1

标签: rmatrixsummarize

解决方案


一种方法dplyr

如果您as.data.frame从. 最后,您无论如何都需要一个,因为您将同时拥有和在您的桌子上。as_tibblematrixdata.framenumericlogical

mat <- matrix(
 c(T, F, F, T, F, T, T, T, F, F, T, F, F, T, T, T, T, T, F, F, T, F, F, T, F),
 ncol = 5,
 byrow = TRUE,
 dimnames = list(NULL, LETTERS[1:5])
)

library(dplyr)
mat %>%
  as_tibble %>%    # convert matrix to tibble, to be able to group
  group_by_all %>% # group by every column so we can count by group of equal values
  tally %>%        # tally will add a count column and keep distinct grouped values
  ungroup          # ungroup the table to be clean
#> # A tibble: 3 x 6
#>   A     B     C     D     E         n
#>   <lgl> <lgl> <lgl> <lgl> <lgl> <int>
#> 1 TRUE  FALSE FALSE TRUE  FALSE     2
#> 2 TRUE  FALSE FALSE TRUE  TRUE      1
#> 3 TRUE  TRUE  TRUE  FALSE FALSE     2

reprex 包(v0.2.0)于 2018 年 5 月 29 日创建。

和一个基本的解决方案:

df <- as.data.frame(mat)
df$n <- 1
aggregate(n~.,df,sum)
#      A     B     C     D     E n
# 1 TRUE  TRUE  TRUE FALSE FALSE 2
# 2 TRUE FALSE FALSE  TRUE FALSE 2
# 3 TRUE FALSE FALSE  TRUE  TRUE 1

或作为一个班轮:aggregate(n~.,data.frame(mat,n=1),sum)


推荐阅读