2016-03-07 119 views
0

我想根據每行中NA的數量過濾data.frame根據行向NA計數過濾數據幀

如果我開始與以下,

> d 
    A B C E 
1 2 2 6 7 
2 4 9 NA 10 
3 6 NA NA 4 
4 9 7 1 8 

我想過濾d列有2或更多NA的除去行A,B和C,以產生:

A B C E 
1 2 2 6 7 
2 4 9 NA 10 
4 9 7 1 8 

回答

0

爲了可再現性,請在下面定義data.frame,並在每行中定義各種數量的NA

df <- data.frame(
    A = c(1, 2, 3, NA), 
    B = c(1, 2, NA, NA), 
    C = c(1, NA, NA, NA), 
    E = c(5, 6, 7, 8) 
) 

定義計數在給定行,如果NA的數的函數:

countNA <- function(df) apply(df, MARGIN = 1, FUN = function(x) length(x[is.na(x)])) 

基於問題的措辭,從這個計算中排除列E

df_noE <- subset(df, select=-E) 

現在使用上面的函數計算每行NA s:

na_count <- countNA(df_noE) 

現在過濾原始data.frame這個數:

df[na_count < 2,] 

在單行一起:

df[countNA(subset(df, select=-E)) < 2,] 
+0

謝謝Saladi!爲了澄清,如果我想擴展到在我的數據框列表中的每個數據框上執行,我會用我的df [i]替換df嗎? –

+0

如果'df'實際上是一個數據框的列表,我想你會想'df [[i]]' –

+0

非常感謝@saladi - 我在這裏發佈了我的新問題http://stackoverflow.com/問題/ 35835597/in-r-use-a-function-apply-lapply-that-is-working-over-a-list-of-dat –

2

我們可以對數據集中的列子集使用rowSumsis.na子集行

d[rowSums(is.na(d[1:3]))<2,] 
# A B C E 
#1 2 2 6 7 
#2 4 9 NA 10 
#4 9 7 1 8 

d[1:3]僅選擇'A,B,C'列的數據集。應用is.na將其轉換爲TRUE/FALSE的邏輯矩陣,在rowSums的每一行中執行TRUE值的sum,最後檢查該數字是否小於2以獲得我們用於子集化行的邏輯vector


另一種方法是使用Reduce+

d[Reduce(`+`,lapply(d[1:3], is.na)) <2,] 
+1

這是一個更好的答案 –