R中如何统计A、B曾分别为1(无需同行)的唯一id数量?
你的代码逻辑问题在于:你筛选的是同一行同时满足A=1和B=1的记录,你的示例数据中不存在这类行,因此返回结果为0,不符合需求。
你需要的是判断每个id是否同时满足「至少有一条记录A=1」和「至少有一条记录B=1」,可以用以下几种方法实现:
方法1:基础R集合运算(最简单直接)
分别提取出现过A=1、B=1的id集合,取交集的长度即可:
# 提取所有出现过A=1的唯一id id_A <- unique(df$id[df$A == 1]) # 提取所有出现过B=1的唯一id id_B <- unique(df$id[df$B == 1]) # 计算两个集合的交集长度 length(intersect(id_A, id_B))
运行结果为2,符合预期。
方法2:基础R分组统计
按id分组统计每个id的A、B是否出现过1,再筛选符合条件的id数:
# 按id聚合,分别统计每个id是否存在A=1、B=1 id_stat <- aggregate(cbind(has_A = A, has_B = B) ~ id, df, FUN = function(x) as.integer(any(x == 1))) # 统计同时满足两个条件的id数量 nrow(subset(id_stat, has_A == 1 & has_B == 1))
方法3:dplyr 写法(更易读)
如果你常用tidyverse生态,可以用分组汇总的逻辑实现:
library(dplyr) df %>% group_by(id) %>% summarise( has_A = any(A == 1), has_B = any(B == 1) ) %>% filter(has_A, has_B) %>% nrow()
以上三种方法都可以得到你需要的结果:111、153两个id符合条件,108只有A=1的记录没有B=1的记录,所以最终统计值为2。
内容的提问来源于stack exchange,提问作者Nao
相关产品推荐
相关产品推荐

