R语言如何筛选数据框中V6列值恰好出现2次的行
R语言实现:筛选V6列取值恰好出现2次的所有行
原有代码失效原因
之前写的duplicated(V6)逻辑存在缺陷:这个函数只会标记重复值里非第一次出现的行,既不会统计每个取值的总出现次数,还会漏掉重复取值对应的第一行,无法满足“取值恰好出现2次就保留全部对应行”的要求。
可用实现方案
dplyr 方案
如果习惯用tidyverse语法,分组统计每组行数后筛选即可,逻辑最清晰:
library(dplyr) df <- as.data.frame(date) # 按V6分组,保留组内恰好2行的所有数据 df1 <- df %>% group_by(V6) %>% filter(n() == 2) %>% ungroup()
如果不想写分组逻辑,也可以用add_count直接生成频次列筛选:
df1 <- df %>% add_count(V6) %>% filter(n == 2) %>% select(-n)
基础R方案
不加载第三方包也能实现,两种写法任选:
- 用
ave按组计数筛选
df <- as.data.frame(date) df1 <- df[ave(seq_len(nrow(df)), df$V6, FUN = length) == 2, ]
- 用
table统计频次后匹配目标值
v6_freq <- table(df$V6) target_val <- names(v6_freq)[v6_freq == 2] df1 <- df[df$V6 %in% target_val, ]
示例数据集参考

上述代码运行后,会自动过滤V6列取值出现1次、3次及以上的所有行,仅保留出现恰好2次的取值对应的全部两行结果,和预期一致。
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

