【问题标题】:How can I remove observations from a data frame conditionally without losing NA values in R?如何有条件地从数据框中删除观察结果而不丢失 R 中的 NA 值?
【发布时间】:2016-10-04 10:10:32
【问题描述】:

在数据框中有一个名为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 的观察结果,并且只删除那些是数字的。第二步是估算缺失值。

【问题讨论】:

  • 行得通,谢谢@akrun - 如果有人能解释其中的区别,我很乐意接受答案。

标签: r subset na missing-data


【解决方案1】:

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 和满足逻辑条件的行都应该返回。在这种情况下,

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))

【讨论】:

  • 优秀。你甚至回答了我想到的一个后续问题。感谢您的帮助。
猜你喜欢
  • 2018-01-07
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2023-01-20
相关资源
最近更新 更多