【问题标题】:Filtering NAs values in a data.frame过滤 data.frame 中的 NAs 值
【发布时间】:2015-10-14 05:47:17
【问题描述】:

我想过滤所有年龄为“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

【问题讨论】:

  • 使用?is.na过滤NA

标签: r na


【解决方案1】:

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

【讨论】:

  • 谢谢,它解决了我的问题。虽然我很清楚为什么字符串 == "NA" 有效但 != "NA" 无效?
  • @WoodChopper - 它不起作用。比较 NA"NA" 会得到 NA,当您尝试使用它来选择行时,它只会返回一个充满 NAs 的行。
  • 好的,我终于明白了:(谢谢!
【解决方案2】:

您的错误是 "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), ]

【讨论】:

  • 它应该不起作用。请参阅我的新示例。 NA 与“NA”不同
猜你喜欢
  • 2016-08-23
  • 1970-01-01
  • 2015-03-26
  • 2019-02-14
  • 2014-11-17
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2020-12-01
相关资源
最近更新 更多