如何有条件地从数据帧中删除观测值而不丢失R中的NA值?

如何有条件地从数据帧中删除观测值而不丢失R中的NA值?,r,subset,na,missing-data,R,Subset,Na,Missing Data,在数据框中有一个名为YOB的变量。如您所见,共有333个NA值 > summary(train$YOB) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 1880 1970 1983 1980 1993 2039 333 我发现了一些异常值,并希望消除它们。小于1900且大于2003的任何项目均应删除。我试图通过索引来实现这一点 train = train[which(tra

在数据框中有一个名为
YOB
的变量。如您所见,共有333个
NA

> summary(train$YOB)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
   1880    1970    1983    1980    1993    2039     333 

我发现了一些异常值,并希望消除它们。小于1900且大于2003的任何项目均应删除。我试图通过索引来实现这一点

train = train[which(train$YOB >= 1900 & train$YOB <= 2003),]

另一方面,我在使用
subset
命令时也面临同样的问题

> train = subset(train, YOB >= 1900 & YOB <= 2003)
> summary(train$YOB)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1900    1970    1983    1980    1993    2003 
>列车=子集(列车,YOB>=1900和YOB汇总(列车$YOB)
最小第一个曲中位数平均第三个曲最大值。
1900    1970    1983    1980    1993    2003 

我也曾尝试在两次尝试中使用此条件,但均未成功,例如:

> train = train[which(!is.na(train$YOB) & train$YOB >= 1900 & train$YOB <= 2003),]
> summary(train$YOB)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1900    1970    1983    1980    1993    2003 
>train=train[其中(!is.na(train$YOB)和train$YOB>=1900和train$YOB摘要(train$YOB)
最小第一个曲中位数平均第三个曲最大值。
1900    1970    1983    1980    1993    2003 


我想在
YOB
变量中保留有
NA
的观察值,只删除那些数值。第二步是计算缺失值。

将给出数值索引并跳过所有那些NA行。为了避免这种情况,使用不带wrappi的逻辑索引使用
哪个
设置为ng。这样索引将为NA,即使有其他非NA的值,该行也将保持为NA

res1 <- train[train$YOB >= 1900 & train$YOB <= 2003,]
res1[is.na(res1$YOB),]
#   YOB col2
#NA  NA   NA

用一个简单的例子

set.seed(25)
d1 <- data.frame(v1 = c(NA, 1, 5), v2 = rnorm(3))
d1$v1 >1
#[1]    NA FALSE  TRUE
我们只得到真值的索引。根据OP,NA和满足逻辑条件的行都应该返回。在这种情况下

d1[is.na(d1$v1)|d1$v1 > 1,]
# v1         v2
#1 NA -0.2118336
#3  5 -1.1533076
数据
set.seed(29)

训练很有效,谢谢@akrun-如果有人能解释两者的区别,我很乐意接受答案。太好了。你甚至回答了我想问的一个问题。谢谢你的帮助。
set.seed(25)
d1 <- data.frame(v1 = c(NA, 1, 5), v2 = rnorm(3))
d1$v1 >1
#[1]    NA FALSE  TRUE
which(d1$v1 >1)
#[1] 3
d1[is.na(d1$v1)|d1$v1 > 1,]
# v1         v2
#1 NA -0.2118336
#3  5 -1.1533076
set.seed(29)
train <- data.frame(YOB = sample(c(NA, 1850:2015), 100, replace=TRUE), 
           col2 = rnorm(100))