R语言如何删除通过which()函数及取模匹配的目标行
R 数据框指定行删除实现
代码中会导致逻辑失效的问题
- 变量覆盖:直接拿存储原始数据的
Df变量先后存放NA位置、筛选后的索引向量,执行完两行代码后原数据框已经被完全替换成索引向量,根本拿不到原始数据,更无法执行删行操作 - 判断逻辑偏差:
- 缺失值判断错误:
Df == 'NA'仅能匹配字符串形式的"NA"文本,对R原生的逻辑型缺失值NA完全无效——毕竟任何值和NA做等值比较,结果都是NA,识别原生缺失值必须用is.na() - 取模操作冗余嵌套:行索引本身是数值向量,直接对向量做
%%2取模即可,套lapply反而会返回列表结构,后续做索引匹配肯定报错
- 缺失值判断错误:
修正后可直接运行的实现
# 先给原始数据框单独命名,避免和索引变量重名,比如叫raw_df # 1. 提取所有含缺失值的行号,加unique去重(避免一行多列是NA导致的重复行号) all_bad_rows <- unique(which(is.na(raw_df), arr.ind = TRUE)[, "row"]) # *如果你的数据里的缺失标记是字符串"NA",就把判断逻辑换成: # all_bad_rows <- unique(which(raw_df == "NA", arr.ind = TRUE)[, "row"]) # 2. 从这些有问题的行号里,筛出奇数编号的待删除行 rows_to_remove <- all_bad_rows[all_bad_rows %% 2 == 1] # 3. R中删行直接用负索引实现,-后接要删除的行号即可 cleaned_df <- raw_df[-rows_to_remove, ]
小提示
- 就算最后筛出来的
rows_to_remove是空的(没有符合条件的行),负索引操作也不会报错,会直接返回原始数据框 - 查找NA位置时加
arr.ind = TRUE是为了返回带行列标识的位置矩阵,不会因为扁平化索引把行号算错位
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

