如何按每100个元素分段统计布尔向量的True/False数量?
分段统计布尔向量中True/False数量的方法
嗨,我来帮你搞定这个分段统计布尔向量的问题!你之前的代码是遍历整个向量统计总数,那我们只需要先把向量按每100个元素分组,再对每个组单独统计就好啦。下面给你几种可行的方法,包括你提到的split结合的方式,还有更简洁的替代方案:
方法一:split + lapply + table(最贴合你的思路)
首先要注意,你之前写的split(vect,10)是不对的,我们需要生成一个分组因子,告诉R怎么把1000个元素分成10组(每组100个)。可以用rep(1:10, each=100)来生成这个分组标记,然后结合split拆分向量,再用lapply对每个分组做统计:
# 先构造示例布尔向量(替换成你的真实数据) set.seed(123) vect <- sample(c(TRUE, FALSE), 1000, replace = TRUE) # 生成分组因子:10组,每组100个元素 groups <- rep(1:10, each = 100) # 拆分向量 vect_split <- split(vect, groups) # 对每个分组统计True/False数量 counts <- lapply(vect_split, table) # 转换为数据框,更直观查看结果 counts_df <- do.call(rbind, counts) colnames(counts_df) <- c("FALSE", "TRUE") # 布尔型的table默认按FALSE、TRUE排序 rownames(counts_df) <- paste0("Group_", 1:10)
运行后counts_df就是每个分组的统计结果,比如Group_1对应的行就是第1-100个元素的True/False数量。
方法二:tapply(更简洁的基础R方法)
如果你不想拆分向量,可以直接用tapply对每个分组做统计,利用R中TRUE=1、FALSE=0的特性,sum()就能直接得到True的数量:
# 同样先定义分组因子 groups <- rep(1:10, each = 100) # 统计每个分组的True数量 true_counts <- tapply(vect, groups, sum) # 计算每个分组的False数量(每组总长度100,减去True的数量) false_counts <- tapply(vect, groups, function(x) length(x) - sum(x)) # 合并成结构化的数据框 result_df <- data.frame( Group = paste0("Group_", 1:10), True_Count = true_counts, False_Count = false_counts )
方法三:dplyr(tidyverse风格,适合数据处理场景)
如果你熟悉tidyverse生态,用dplyr的分组统计会更直观,代码可读性更高:
library(dplyr) result_df <- tibble( value = vect, # 把布尔向量转为数据框列 group = rep(1:10, each = 100) # 添加分组列 ) %>% group_by(group) %>% # 按分组聚合 summarise( True_Count = sum(value), # 统计True数量 False_Count = n() - True_Count # 计算False数量 ) %>% ungroup() %>% mutate(group = paste0("Group_", group)) # 美化分组名称
为什么你原来的代码只统计总数?
你之前的循环是遍历整个vect的所有元素,没有引入分组逻辑,所以会把所有True/False累加起来,得到的是整个向量的总数。而上面的方法都是先把向量按100个元素拆分/分组,再对每个组单独统计,自然就能得到分段的结果啦。
内容的提问来源于stack exchange,提问作者imantha
相关产品推荐
相关产品推荐

