如何删除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
相关产品推荐
相关产品推荐

