总结逻辑矩阵

时间:2018-05-29 22:21:44

标签: r matrix summarize

我在每列下面都有一个填充了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

3 个答案:

答案 0 :(得分:3)

使用dplyr的方法:

如果您从as.data.frame开始,请先使用as_tibble(或此处为matrix)。最后,您需要data.frame,因为您的表格中同时包含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)

答案 1 :(得分:2)

来自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

答案 2 :(得分: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>将数据表划分为多组行,其中<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