在 data.frame 中过滤 NA 值

Filtering NAs values in a data.frame

我想过滤所有年龄为 "NA" 的数据。所以我使用 train[train$Age != "NA",] 它总是 returns 完整的数据框。

[1] 891
> nrow(train)
[1] 891
> nrow(train[train$Age == "NA",])
[1] 177
> nrow(train[train$Age != "NA",])
[1] 891

我正在学习 R,我有一点被打动了。我知道它很基础,但我自己或 google.

无法弄清楚

数据集样本

     PassengerId Survived Pclass                                                Name    Sex Age SibSp Parch           Ticket
1           1        0      3                             Braund, Mr. Owen Harris   male  22     1     0        A/5 21171
2           2        1      1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1     0         PC 17599
3           3        1      3                              Heikkinen, Miss. Laina female  26     0     0 STON/O2. 3101282
4           4        1      1        Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1     0           113803
5           5        0      3                            Allen, Mr. William Henry   male  35     0     0           373450
6           6        0      3                                    Moran, Mr. James   male  NA     0     0           330877

你的错误是 "NA" 是一个字符,而不是 NA 符号。有一个函数可以测试向量的某些分量是否为 NA: is.na。你可以看到这个例子的区别:

x = c("NA", NA)
x == NA
# [1] NA NA
x == "NA"
# [1] TRUE   NA
is.na(x)
# [1] FALSE  TRUE

所以,尝试:

train[!is.na(train$Age), ]

此示例可能会有所帮助,它向您展示了针对 "NA"(有效字符串)的测试如何生成实际的 NA(缺失)值,这些值会填满您选择的行。

train <- data.frame(id=1:5, Age=c(1:3,NA,5))
train
#  id Age
#1  1   1
#2  2   2
#3  3   3
#4  4  NA
#5  5   5

train$Age=="NA"
#[1] FALSE FALSE FALSE    NA FALSE

train[train$Age=="NA",]
#   id Age
#NA NA  NA

train$Age!="NA"
#TRUE TRUE TRUE   NA TRUE

train[train$Age!="NA",]
#   id Age
#1   1   1
#2   2   2
#3   3   3
#NA NA  NA
#5   5   5

您实际上想使用 is.na 进行测试:

is.na(train$Age)
#[1] FALSE FALSE FALSE  TRUE FALSE

!is.na(train$Age)
#[1]  TRUE  TRUE  TRUE FALSE  TRUE

train[!is.na(train$Age),]
#  id Age
#1  1   1
#2  2   2
#3  3   3
#5  5   5