You need to enable JavaScript to run this app. 如何使用dplyr按组内非零计数的观测数删除指定分组?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用dplyr按组内非零计数的观测数删除指定分组?

实现分组过滤的核心逻辑

你之前两个操作的核心偏差是:

  • 直接筛Count >=1会提前删掉组内的零值行,没法保留符合条件组的完整原始数据
  • 用n()做判断统计的是组内所有行的总数,不是你需要的「组内非零计数的观测行数」

我们真正要做的是:

  1. 按组计算每个组里非零计数的总行数
  2. 用这个计算出的数值当过滤阈值,把非零行数≤1的组整组移除
  3. 保留符合条件组的所有原始行(包括组内的零值行,不做行级删除)
可直接运行的实现代码
library(dplyr)
# 示例原始数据
df <- tibble(Group = c("A","A","A","B","B","B","B","B","C","C","C"), 
             Year = c(1,2,3,1,2,3,4,5,1,2,3),
             Count = c(5,0,0,10,15,8,0,6,0,0,10))

# 目标过滤逻辑
df_filtered <- df %>%
  group_by(Group) %>%
  # sum(Count >=1) 会逐组统计非零观测的数量,作为过滤条件
  filter(sum(Count >= 1) > 1) %>%
  ungroup()
逻辑验证

逐组核对计算结果,完全匹配你的预期:

  • A组:非零观测数为1(仅Count=5的行),不满足>1的条件,整组删除
  • B组:非零观测数为4(Count=10、15、8、6的行),满足条件,保留全部5行原始数据(包含Count=0的Year=4行)
  • C组:非零观测数为1(仅Count=10的行),不满足条件,整组删除
等价备选写法

如果需要更透明的计算过程,也可以先把组内非零数作为临时列加入,再做过滤,效果完全一致:

df %>%
  group_by(Group) %>%
  mutate(group_non_zero_n = sum(Count >= 1)) %>%
  ungroup() %>%
  filter(group_non_zero_n > 1) %>%
  select(-group_non_zero_n) # 移除临时辅助列

内容的提问来源于stack exchange,提问作者Oscar Henry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 10:06:03