总结一个逻辑矩阵

Summarise a logical Matrix

我有一个大矩阵,每列下都填充了 True/False 个值。有没有一种方法可以汇总矩阵,使每一行都是唯一的,并且我有一个新列,其中包含该行出现频率的总和。

示例:

    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

dplyr 的方法:

如果您从 matrix 开始,请先使用 as.data.frame(或此处 as_tibble)。最后你需要有一个 data.frame 无论如何你将在你的 table.

中同时拥有 numericlogical
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 package (v0.2.0) 创建于 2018-05-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)

count 来自 plyr 的函数正是您正在寻找的(假设 m 是您的矩阵):

plyr::count(m)

#   x.A   x.B   x.C   x.D   x.E freq
#1 TRUE FALSE FALSE  TRUE FALSE    2
#2 TRUE FALSE FALSE  TRUE  TRUE    1
#3 TRUE  TRUE  TRUE FALSE FALSE    2

如果你有一个在@Moody_Mudskipper的回答中定义的对象mat,你可以

library(data.table)
dt <- as.data.table(mat)

dt[, .N, by = names(dt)]

#       A     B     C     D     E N
# 1: TRUE FALSE FALSE  TRUE FALSE 2
# 2: TRUE  TRUE  TRUE FALSE FALSE 2
# 3: TRUE FALSE FALSE  TRUE  TRUE 1

说明

by = <names> 将数据 table 分成多组行,其中 <names> 中所有变量的值在各行之间相等。如果你这样做 by = names(dt) 它将分成所有变量都相等的组。

.N 是给定行组中的观察数。

对于您的编辑,如果您的 data.frame 被命名为 df,您可以

setDT(df) # convert to data table
df[, .(rev = sum(rev), total = .N), by = A:E] # get desired output

#       A     B     C     D     E rev N
# 1: TRUE FALSE FALSE  TRUE FALSE   3 2
# 2: TRUE  TRUE  TRUE FALSE FALSE   5 2
# 3: TRUE FALSE FALSE  TRUE  TRUE   5 1