R语言按条件删除dataframe指定行时其余数据变NA如何解决
问题根源
你操作后出现大量NA,是两个错误共同导致的:
- 代码里对象名写错:原数据框叫
data,你行索引里用的是data2$ex做判断,调用了错误的对象。 - 没摸透R逻辑判断的默认规则:在R里,任何值和
NA做比较(比如!=0、==1这类判断),返回结果都是NA。用逻辑向量做行筛选时,索引值为NA的位置会直接把整行填充为NA,这就是你看到大量内容变空的核心原因。你的ex列有191个NA值,这些行在跑ex !=0判断时全都会返回NA,自然会出问题。
正确写法
核心逻辑是:只明确删除ex等于0的行,ex为1/2/3、以及ex为NA的行全部保留,两种常用写法都不会改动其余列内容:
写法1:基础R索引(最推荐,不容易出错)
用%in%做匹配可以自动规避NA判断的坑:ex %in% 0只有在ex明确等于0的时候返回TRUE,ex为NA或者其他值时都返回FALSE,取反后刚好筛掉ex=0的行:
data <- data[!(data$ex %in% 0), ]
如果你习惯写显式判断,也可以把NA的判断补全,效果完全一致:
data <- data[is.na(data$ex) | data$ex != 0, ]
写法2:subset函数
subset默认会丢弃判断结果为NA的行,所以必须把保留NA的条件显式写上,才不会把191条NA值的行误删:
data <- subset(data, is.na(ex) | ex != 0)
结果校验
操作完成后可以重新跑频数统计验证结果:
table(data$ex, useNA = "ifany")
正常返回结果应该为:取值1对应9条、2对应25条、3对应4条、NA对应191条,总计229条观测,刚好删掉33条ex=0的行,其余68个变量的内容不会有任何改动。
内容的提问来源于stack exchange,提问作者user3416877
相关产品推荐
相关产品推荐

