如何在R中编写自定义函数按特定条件删除数据框行?
按特定条件删除数据框行的解决方案
核心规则提炼
针对你的需求,规则可明确为:
- 按
col1分组后,若该分组内存在**col1与col2值相等**的行,则仅保留这些符合col1 == col2的行; - 若该分组内不存在
col1 == col2的行,则保留该分组的所有行。
方法一:使用dplyr包(简洁直观)
library(dplyr) # 原始数据框 df <- data.frame(col1 = c("a", "a", "m", "m", "m", "m", "n", "q"), col2 = c("a", "b", "m", "x", "y", "z", NA, "p")) # 清洗数据 df_cleaned <- df %>% group_by(col1) %>% filter( # 逻辑:要么组内无匹配行则全留,要么只留匹配行 !any(col1 == col2, na.rm = TRUE) | col1 == col2 ) %>% ungroup() # 输出结果 print(df_cleaned)
运行后输出与期望一致:
# A tibble: 4 × 2 col1 col2 <chr> <chr> 1 a a 2 m m 3 n NA 4 q p
方法二:使用base R(无需额外包)
# 原始数据框 df <- data.frame(col1 = c("a", "a", "m", "m", "m", "m", "n", "q"), col2 = c("a", "b", "m", "x", "y", "z", NA, "p")) # 标记每个分组是否存在col1==col2的行 group_has_match <- with(df, ave(col1 == col2, col1, FUN = function(x) any(x, na.rm = TRUE))) # 筛选符合条件的行 df_cleaned <- df[!group_has_match | (df$col1 == df$col2), ] # 输出结果 print(df_cleaned)
输出结果:
col1 col2 1 a a 3 m m 7 n <NA> 8 q p
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

