我在每列下面都有一个填充了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
答案 0 :(得分:3)
使用dplyr
的方法:
as.data.frame
开始,请先使用as_tibble
(或此处为matrix
)。最后,您需要data.frame
,因为您的表格中同时包含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)
答案 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