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

如何删除R数据框中仅包含数字9的行?

我来帮你搞定这个问题!针对你的需求——删除那些除ID列外所有非NA值都是9的行(比如ID103、104、110这类),这里有两种实用的解决方案,先把你的数据复现出来方便测试:

df1 <- tibble::tibble(
  ID = c(101, 102, 103, 104, 105, 106, 107, 108, 109, 110),
  a = c(NA, 9, NA, NA, NA, NA, NA, NA, NA, NA),
  b = c(NA, 10, 9, 9, NA, NA, 2, NA, NA, NA),
  c = c(NA, NA, NA, 9, 1, NA, NA, 4, 11, 9),
  d = c(NA, NA, NA, NA, 8, NA, NA, 7, 9, 9),
  e = c(NA, NA, NA, NA, 9, NA, NA, 8, NA, 9),
  f = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
  g = c(NA, NA, NA, NA, NA, NA, NA, 9, NA, NA)
)

方法1:用dplyr(tidyverse风格,代码更直观)

这种方式适合习惯tidyverse语法的用户,逐行检查非ID列的数值情况:

library(dplyr)

df_filtered <- df1 %>%
  rowwise() %>%
  mutate(
    # 判断该行非NA值是否全为9
    all_non_na_9 = all(c_across(-ID)[!is.na(c_across(-ID))] == 9),
    # 判断该行是否有非NA值(用来区分全NA行和"非NA全是9"的行)
    has_non_na = any(!is.na(c_across(-ID)))
  ) %>%
  # 保留:要么不是"非NA全是9",要么是全NA的行
  filter(!all_non_na_9 | !has_non_na) %>%
  # 删掉临时生成的辅助列
  select(-all_non_na_9, -has_non_na) %>%
  ungroup()

# 查看结果
df_filtered

如果连全NA的行(比如ID101、106)也想一起删除,直接把filter里的条件改成!all_non_na_9就行。

方法2:用基础R(无需额外安装包)

要是你不想加载dplyr,基础R的apply函数也能实现:

# 提取除ID外的所有列
non_id_cols <- df1[-1]

# 逐行判断:是否存在非NA值且所有非NA值都是9
all_9_rows <- apply(non_id_cols, 1, function(row) {
  non_na_vals <- row[!is.na(row)]
  length(non_na_vals) > 0 && all(non_na_vals == 9)
})

# 过滤掉符合条件的行
df_filtered_base <- df1[!all_9_rows, ]

# 查看结果
df_filtered_base

两种方法最终都会保留ID101、102、105、106、107、108、109,删除ID103、104、110,完全符合你的需求~

内容的提问来源于stack exchange,提问作者danny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:15:42