R语言如何删除数据框中Code.3列为空值的整行数据
代码报错原因
你之前写的两段代码无法运行,核心是几个基础语法和逻辑错误:
- dplyr版本的错误:R中没有名为
missing的内置对象用来标识空值,判断空值需要使用专门的is.na()函数,直接和不存在的对象做相等判断必然报错。 - for循环版本的错误更多:
- 条件判断里错把赋值符
=当相等判断符==用 is_empty()函数用来判断长度为0的R对象,不能用来判断数据框单元格的空值- 循环遍历行号同时删除行的逻辑有缺陷:删除第i行后,后续所有行的索引都会前移1位,按固定的
1:319序列遍历必然出现漏判、索引越界的问题 - 最后
append的逻辑完全错误,反复将列表嵌套进自身无法得到规整的数据框结果
- 条件判断里错把赋值符
正确实现方法
不需要写复杂循环,直接用现成函数一行就能搞定,优先推荐你最开始想用的dplyr方案:
dplyr 实现
如果你的空单元格在R中被正确识别为NA(R默认的空值类型),直接用drop_na()指定要删除空值的列即可:
library(dplyr) df_cleaned <- df %>% drop_na(Code.3)
如果读入数据时没有做空值转换,空单元格被识别成了空字符串"",就用filter加判断条件即可,如果你还需要把示例里的***这类无效值也一并删掉,可以追加对应判断:
library(dplyr) df_cleaned <- df %>% filter( !is.na(Code.3), # 排除NA空值 Code.3 != "", # 排除空字符串 Code.3 != "***" # 不需要删***就删掉这行 )
基础R实现(无需加载额外包)
如果不想用dplyr,直接用基础R的索引逻辑也能实现:
# 仅删除NA类型空值 df_cleaned <- df[!is.na(df$Code.3), ] # 同时删除NA、空字符串、*** df_cleaned <- df[!is.na(df$Code.3) & df$Code.3 != "" & df$Code.3 != "***", ]
小提示:如果是读入数据阶段就想自动把空字符串、***这类值转成NA,可以在读入函数(比如
read.csv、read_excel)里设置na.strings = c("", "***")参数,后续清理数据会更方便。
内容的提问来源于stack exchange,提问作者user19304348
相关产品推荐
相关产品推荐

