我想根據每行中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
我想根據每行中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
爲了可再現性,請在下面定義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,]
我們可以對數據集中的列子集使用rowSums
與is.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,]
這是一個更好的答案 –
謝謝Saladi!爲了澄清,如果我想擴展到在我的數據框列表中的每個數據框上執行,我會用我的df [i]替換df嗎? –
如果'df'實際上是一個數據框的列表,我想你會想'df [[i]]' –
非常感謝@saladi - 我在這裏發佈了我的新問題http://stackoverflow.com/問題/ 35835597/in-r-use-a-function-apply-lapply-that-is-working-over-a-list-of-dat –