2016-11-06 90 views
3

我有一些數據,我在R看。一個特定的列,標題爲「高度」,包含幾行NA。如何在R中子集數據而不丟失NA行?

我正在尋找我的數據框的子集,以便高於某個值的所有高度都從我的分析中排除。

df2 <- subset (df1 , Height < 40) 

然而每當我這樣做,R會自動刪除所有高度包含NA值的行。我不想要這個。我已經嘗試了包括na.rm的參數

f1 <- function (x , na.rm = FALSE) { 
df2 <- subset (x , Height < 40) 
} 
f1 (df1 , na.rm = FALSE) 

但是這似乎沒有做任何事情; NA中的行仍然最終從我的數據框中消失。有沒有一種方法可以將數據進行子集化,而不會丟失NA行?

+0

或者,我們可以使用'子集(DF1,高度<40 | is.na(高度))' – Zach

+0

爲了完整起見,從'dplyr'包類似的選項'filter(df1,Height <40 | is.na(Height))' –

回答

6

如果我們決定使用subset功能,那麼我們就需要注意:

For ordinary vectors, the result is simply ‘x[subset & !is.na(subset)]’. 

所以唯一的非NA值將被保留。

如果你想保持NA案件,使用邏輯或條件,讓R不掉NA案件:

subset(df1, Height < 40 | is.na(Height)) 
# or `df1[df1$Height < 40 | is.na(df1$Height), ]` 

不要直接使用(即將解釋):

df2 <- df1[df1$Height < 40, ] 

實施例

df1 <- data.frame(Height = c(NA, 2, 4, NA, 50, 60), y = 1:6) 

subset(df1, Height < 40 | is.na(Height)) 

# Height y 
#1  NA 1 
#2  2 2 
#3  4 3 
#4  NA 4 

df1[df1$Height < 40, ] 

# Height y 
#1  NA NA 
#2  2 2 
#3  4 3 
#4  NA NA 

後者失敗的原因是NA索引NA。考慮這個簡單的例子用向量:

x <- 1:4 
ind <- c(NA, TRUE, NA, FALSE) 
x[ind] 
# [1] NA 2 NA 

我們需要以某種方式與TRUE替換那些NA。最直接的方法是添加另一個「或」條件is.na(ind)

x[ind | is.na(ind)] 
# [1] 1 2 3 

這也正是將您的情況發生什麼。如果您的Height包含NA,那麼邏輯運算Height < 40結束了TRUE/FALSE/NA的混合,因此我們需要用TRUE替代NA,如上所述。

1

你也可以這樣做:

df2 <- df1[(df1$Height < 40 | is.na(df1$Height)),]