过滤data.frame中的NAs值

时间:2015-10-14 05:47:17

标签: r na

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

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

我正在学习R而且我在某一点上受到了打击。我知道它是如此基本,但我无法自己解决这个问题或谷歌。

数据集样本

     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

2 个答案:

答案 0 :(得分:3)

此示例可能会有所帮助,向您展示针对"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

答案 1 :(得分:1)

您的错误是"NA"是一个字符,而不是NA符号。可以测试向量的某些组件是NAis.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), ]