You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言按id分组过滤:cat多类别时优先保留A类的实现方法查询

R数据框按分组规则过滤实现方法

方法1:dplyr实现(推荐,语法简洁易读)

首先加载dplyr包,再按分组规则过滤:

library(dplyr)

# 构造示例数据集
df <- data.frame(id = c(1,2,3,3,4,5),
                 cat= c("A","A","A","B","B","B"))

df.1 <- df %>%
  group_by(id) %>%
  # 分组后判断当前id的cat唯一值数量,超过1个就只保留cat为A的记录,否则全保留
  filter(if(n_distinct(cat) > 1) cat == "A" else TRUE) %>%
  ungroup()

输出结果和需求完全一致。

方法2:base R实现(无需安装第三方包)

# 构造示例数据集
df <- data.frame(id = c(1,2,3,3,4,5),
                 cat= c("A","A","A","B","B","B"))

df_split <- split(df, df$id)
df.1 <- do.call(rbind, lapply(df_split, function(sub) {
  if (length(unique(sub$cat)) > 1) {
    sub[sub$cat == "A", ]
  } else {
    sub
  }
}))
rownames(df.1) <- NULL # 重置行号为连续值,可选操作

方法3:data.table实现(适合大数据量场景,性能更高)

library(data.table)
# 构造示例数据集并转换为data.table格式
df <- data.frame(id = c(1,2,3,3,4,5),
                 cat= c("A","A","A","B","B","B"))
setDT(df)

df.1 <- df[, .SD[if(uniqueN(cat) > 1) cat == "A" else TRUE], by = id]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:24:03