如何汇总布尔Matrix:保留唯一行并统计出现次数及rev列求和
解决布尔矩阵分组汇总及rev列求和问题
嘿,我来帮你搞定这个问题!不管是最初的布尔矩阵去重统计次数,还是后来新增rev列后的分组求和,用R都能轻松实现,给你两种常用的方法参考:
一、初始需求:布尔矩阵保留唯一行并统计出现次数
先把你的示例矩阵转成可操作的对象:
# 构造初始布尔矩阵 mat <- matrix(c( TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE ), nrow=5, byrow=TRUE, dimnames=list(1:5, c("A","B","C","D","E")))
方法1:用dplyr包(语法更直观)
先加载dplyr,然后分组汇总:
library(dplyr) as.data.frame(mat) %>% # 按所有列分组 group_by(across(everything())) %>% # 统计每组行数,作为total列 summarise(total = n(), .groups = "drop")
方法2:用Base R(无需额外安装包)
把矩阵转成数据框后,用aggregate或者table处理:
df <- as.data.frame(mat) # 用aggregate实现 agg_result <- aggregate(. ~ ., data=df, FUN=length) # 或者用table转成数据框,重命名计数列 table_result <- as.data.frame(table(df)) colnames(table_result)[ncol(table_result)] <- "total"
运行后就能得到你想要的唯一行+出现次数的结果啦。
二、补充需求:新增rev列后,分组求和rev并统计次数
先构造你补充后的data.frame:
df_rev <- data.frame( A = c(TRUE, TRUE, TRUE, TRUE, TRUE), B = c(FALSE, TRUE, FALSE, TRUE, FALSE), C = c(FALSE, TRUE, FALSE, TRUE, FALSE), D = c(TRUE, FALSE, TRUE, FALSE, TRUE), E = c(FALSE, FALSE, TRUE, FALSE, FALSE), rev = c(2, 3, 5, 2, 1) )
方法1:dplyr实现(推荐)
按A到E列分组,同时对rev求和、统计行数:
df_rev %>% # 按A-E列分组,也可以写成across(A:E) group_by(A, B, C, D, E) %>% summarise( rev = sum(rev), total = n(), .groups = "drop" )
方法2:Base R实现
用aggregate同时处理两个目标变量:
# 先给数据框新增一个临时的total列(值为1),再分组求和 base_result <- aggregate(cbind(rev, total) ~ A+B+C+D+E, data = transform(df_rev, total=1), FUN = sum)
这样就能得到你要的:唯一行、rev列求和结果、以及每行出现次数的汇总表了。
内容的提问来源于stack exchange,提问作者Jamie Allan
相关产品推荐
相关产品推荐

