R语言中基于多列值删除特定组合数据行的方法
在R语言中筛选数据框行的实现方法
需求说明
处理数据框df,删除满足以下任一条件的行:
- V1、V2、V3列的值仅包含12与NA的组合(如原数据第2行)
- V1、V2、V3列的值均为12(如原数据第5行)
注意:V1、V2、V3列全为NA的行(如原数据第3行)需保留
原始数据定义
df <- data.frame( "V1" = c(NA, NA, NA, 12, 12), "V2" = c(55, NA, NA, 14, 12), "V3" = c(21, 12, NA, NA, 12), "V4" = c(NA, 32, NA, NA, NA), "V5" = c(NA, NA, 18, NA, NA) ) # 原始数据预览 df
原始数据输出:
V1 V2 V3 V4 V5 1 NA 55 21 NA NA 2 NA NA 12 32 NA 3 NA NA NA NA 18 4 12 14 NA NA NA 5 12 12 12 NA NA
实现方法
方法1:基础R实现
# 提取需要判断的V1-V3列 target_cols <- df[, c("V1", "V2", "V3")] # 构建筛选条件:保留不符合删除规则的行 keep_rows <- !( # 条件1:仅含12和NA且不全为NA apply(target_cols, 1, function(row) all(row %in% c(12, NA)) & !all(is.na(row))) | # 条件2:全为12(na.rm=FALSE确保NA存在时不被误判) apply(target_cols, 1, function(row) all(row == 12, na.rm = FALSE)) ) # 生成结果数据框 filtered_df <- df[keep_rows, ] filtered_df
方法2:dplyr包实现(更简洁)
library(dplyr) filtered_df <- df %>% rowwise() %>% filter( !( (all(c(V1, V2, V3) %in% c(12, NA)) & !all(is.na(c(V1, V2, V3)))) | all(c(V1, V2, V3) == 12, na.rm = FALSE) ) ) %>% ungroup() filtered_df
最终结果
V1 V2 V3 V4 V5 1 NA 55 21 NA NA 3 NA NA NA NA 18 4 12 14 NA NA NA
内容的提问来源于stack exchange,提问作者Rara
相关产品推荐
相关产品推荐

