gpt4 book ai didi

r - 如何在不丢失 R 中的 NA 值的情况下有条件地从数据框中删除观察值?

转载 作者:行者123 更新时间:2023-12-04 20:35:00 25 4
gpt4 key购买 nike

在数据框中有一个名为 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

我想保留具有 NA 的观察结果在 YOB变量,只删除那些数字。这个想法是在第二步估算缺失值。

最佳答案

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值(value)仍然如此。如果我们使用 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))

关于r - 如何在不丢失 R 中的 NA 值的情况下有条件地从数据框中删除观察值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37629691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com