You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:43:13