2015-10-14 89 views
3

我想過濾Age爲「NA」的所有數據。所以我用train[train$Age != "NA",]它總是返回完整的數據幀。過濾數據幀中的NAs值

[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 
+0

使用'is.na'過濾NA – akrun

回答

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 
+0

謝謝,它解決了我的問題。雖然我爲什麼字符串「==」不適用「工作,但不適用」!=「不適用」? – WoodChopper

+0

@WoodChopper - 它不起作用。比較一個「NA」和「」NA「」會給出一個「NA」,當您嘗試使用它來選擇行時,它會返回一行充滿「NA」的行。 – thelatemail

+0

好的,我終於明白了:謝謝! – WoodChopper

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), ] 
+0

所以,我該怎麼辦?其實它的工作原理爲''==它 – WoodChopper

+0

應該不行。看到我的新例子。 NA與「NA」不一樣 –