如何在不丢失 R 中的 NA 值的情况下有条件地从数据框中删除观察值?
How can I remove observations from a data frame conditionally without losing NA values in R?
在数据框中有一个名为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),]
不幸的是,YOB
变量为 NA
的观察结果也被删除。
> summary(train$YOB)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1900 1970 1983 1980 1993 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
我也曾尝试在两次尝试中使用此条件,但都没有成功,例如
> 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
我想在 YOB
变量中保留 NA
的观察结果,只删除那些是数字的观察结果。这个想法是在第二步中估算缺失值。
which
将给出数字索引并跳过所有这些 NA 行。为避免这种情况,请使用不使用 which
换行的逻辑索引。索引将以这种方式为 NA,即使存在其他非 NA 值,该行也将保持为 NA。
res1 <- train[train$YOB >= 1900 & train$YOB <= 2003,]
res1[is.na(res1$YOB),]
# YOB col2
#NA NA NA
正确的方法是使用 is.na
的另一个条件
res2 <- train[is.na(train$YOB)| (train$YOB >= 1900 & train$YOB <= 2003),]
res2[is.na(res2$YOB),]
# YOB col2
#42 NA 0.2258094
使用一个简单的例子
set.seed(25)
d1 <- data.frame(v1 = c(NA, 1, 5), v2 = rnorm(3))
d1$v1 >1
#[1] NA FALSE TRUE
此处,NA
值保持原样。如果我们使用 which
which(d1$v1 >1)
#[1] 3
我们只得到 TRUE 值的索引。根据OP,NA和满足逻辑条件的行都应该return。那样的话,
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))
在数据框中有一个名为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),]
不幸的是,YOB
变量为 NA
的观察结果也被删除。
> summary(train$YOB)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1900 1970 1983 1980 1993 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
我也曾尝试在两次尝试中使用此条件,但都没有成功,例如
> 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
我想在 YOB
变量中保留 NA
的观察结果,只删除那些是数字的观察结果。这个想法是在第二步中估算缺失值。
which
将给出数字索引并跳过所有这些 NA 行。为避免这种情况,请使用不使用 which
换行的逻辑索引。索引将以这种方式为 NA,即使存在其他非 NA 值,该行也将保持为 NA。
res1 <- train[train$YOB >= 1900 & train$YOB <= 2003,]
res1[is.na(res1$YOB),]
# YOB col2
#NA NA NA
正确的方法是使用 is.na
res2 <- train[is.na(train$YOB)| (train$YOB >= 1900 & train$YOB <= 2003),]
res2[is.na(res2$YOB),]
# YOB col2
#42 NA 0.2258094
使用一个简单的例子
set.seed(25)
d1 <- data.frame(v1 = c(NA, 1, 5), v2 = rnorm(3))
d1$v1 >1
#[1] NA FALSE TRUE
此处,NA
值保持原样。如果我们使用 which
which(d1$v1 >1)
#[1] 3
我们只得到 TRUE 值的索引。根据OP,NA和满足逻辑条件的行都应该return。那样的话,
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))