这是我的数据框:
ID <- c('TZ1','TZ2','TZ3','TZ4')
hr <- c(56,32,38,NA)
cr <- c(1,4,5,2)
data <- data.frame(ID,hr,cr)
ID hr cr
1 TZ1 56 1
2 TZ2 32 4
3 TZ3 38 5
4 TZ4 NA 2
我想删除数据$ hr = 56的行。这就是我想要的最终产品:
ID hr cr
2 TZ2 32 4
3 TZ3 38 5
4 TZ4 NA 2
这是我认为可行的:
data = data[data$hr !=56,]
但结果数据框如下所示:
ID hr cr
2 TZ2 32 4
3 TZ3 38 5
NA <NA> NA NA
如何将我的代码mofify以包含NA值,这样就不会发生?谢谢你的帮助,我无法弄清楚。
编辑:我还想在数据框中保留NA值。
答案 0 :(得分:1)
问题在于,当我们执行==
或!=
时,如果存在NA值,它将保持原样并为该对应的NA值创建NA行。因此,只使用TRUE / FALSE值创建逻辑索引的一种方法是在比较中也使用is.na
。
data[!(data$hr==56 & !is.na(data$hr)),]
# ID hr cr
#2 TZ2 32 4
#3 TZ3 38 5
#4 TZ4 NA 2
我们也可以应用反向逻辑
subset(data, hr!=56|is.na(hr))
# ID hr cr
#2 TZ2 32 4
#3 TZ3 38 5
#4 TZ4 NA 2