总结一个逻辑矩阵
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.
中同时拥有 numeric
和 logical
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
我有一个大矩阵,每列下都填充了 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.
numeric
和 logical
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