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
相关产品推荐
相关产品推荐

