R语言如何统计数据框列组所有元素匹配指定值的行数
R语言按列前缀分组统计全列匹配指定值的行数解决方案
核心逻辑调整
你只需要修改sapply内部的计算逻辑,判断每个分组的行是否所有元素都等于1,再对符合条件的行计数即可。推荐用向量化的rowSums实现,效率比逐行apply更高:
# 提取唯一双字母前缀 groups <- unique(substr(names(df), 1, 2)) # 遍历分组统计符合条件的行数 result <- sapply(groups, function(xx) { # 精准匹配前缀筛选对应列,避免列名中间出现目标字符的误匹配 group_cols <- df[, grep(paste0("^", xx), names(df)), drop = FALSE] # 行内所有值为1等价于:行内等于1的数量 = 该分组的列数,统计符合条件的总行数 sum(rowSums(group_cols == 1) == ncol(group_cols)) }) # 转为你需要的两列格式的汇总表 result_df <- data.frame( 前缀 = names(result), 符合条件行数 = as.integer(result), row.names = NULL )
输出验证
代入你提供的示例数据运行后,result_df的输出和你要求的结果完全一致:
前缀 符合条件行数 1 AA 2 2 AB 1 3 AC 0
可选写法(仅作逻辑参考)
如果你更倾向于用逐行判断的写法,也可以用apply实现,逻辑更直观但数据量大时运行速度较慢:
result <- sapply(groups, function(xx) { group_cols <- df[, grep(paste0("^", xx), names(df)), drop = FALSE] sum(apply(group_cols, 1, function(row) all(row == 1))) })
内容的提问来源于stack exchange,提问作者Eldur
相关产品推荐
相关产品推荐

