如何不使用循环删除R dataframe中列值组合存在冲突的行
实现方案
dplyr 实现方法
你要的效果可以直接用分组过滤实现,无需自己写循环:
# 先加载dplyr包,未安装可先运行 install.packages("dplyr") library(dplyr) # 构造示例数据 df <- data.frame( x = c("a","a","b","b","c"), y = c("yes","no", "yes","yes","no") ) # 核心逻辑:按x分组后保留y唯一值数量为1的所有行 result <- df %>% group_by(x) %>% filter(n_distinct(y) == 1) %>% ungroup()
运行后输出结果和你要求的完全一致:
> result # A tibble: 3 × 2 x y <chr> <chr> 1 b yes 2 b yes 3 c no
逻辑说明:n_distinct(y)会计算每个x分组内y列的唯一值数量,只有数量等于1的分组会被整体保留,正好匹配你的规则:过滤y存在多种取值的a分组,同时保留仅出现一次的c分组、y取值全一致的b分组。
base R 实现方法(无需额外安装包)
如果不想依赖第三方包,也可以用向量化函数ave实现,效率远高于手动循环:
df <- data.frame( x = c("a","a","b","b","c"), y = c("yes","no", "yes","yes","no") ) result <- df[ave(df$y, df$x, FUN = function(v) length(unique(v))) == 1, ]
内容的提问来源于stack exchange,提问作者Ahdee
相关产品推荐
相关产品推荐

