2016-04-12 73 views
1

我想從我的數據框中排除具有至少2個連續零的行。例如:排除包含數據幀中連續零的行

subj stimulus var1 var2 var3 var4 
1   A   25  30  15  36 
1   B   0  0  10  0 
1   C   12  0  20  23 

我想排除包含兩個零的刺激B的試驗,但保持C值只包含一個。 到目前爲止,我曾嘗試:

has3Zeros <- function(x) { 
    x <- x[!is.na(x)] == 0 
    if (length(x) < 3) { 
    FALSE 
    } 
} 
df[,!sapply(df, has3Zeros), drop=F] 

,但它告訴我,這是一個無效的參數類型。有沒有一種「簡單」的方法來完成排除連續零的行?

預先感謝您。

+0

即使我掃描的網頁事前,我現在用正確的關鍵字,發現同樣的問題在這裏問:http://stackoverflow.com/questions/11797216/r-count-number-of-zeros-每行和刪除每行多於5零 在我的情況下,答案是:'df [rowSums(df == 0)<= 2,]' – cRazyMind

+2

考慮他們是否「連續」。 – mtoto

回答

2

如果我們正在尋找每一行中的任何連續的零並想要排除該行,則有一種方法是使用applyMARGIN=1循環遍歷行。檢查相鄰元素是否有any相等且爲零,進行否定和子集行。

df1[!apply(df1[-(1:2)], 1, FUN = function(x) any((c(FALSE, x[-1]==x[-length(x)])) & !x)),] 
# subj stimulus var1 var2 var3 var4 
#1 1  A 25 30 15 36 
#3 1  C 12 0 20 23 

或者,如果我們需要的連續零長度是「N」,則rle可應用於每一行,檢查lengths對於那些0「​​值」是否是「N」,否定和子集的行。

df1[!apply(df1[-(1:2)], 1, FUN = function(x) any(with(rle(x==0), lengths[values])==2)),] 
# subj stimulus var1 var2 var3 var4 
#1 1  A 25 30 15 36 
#3 1  C 12 0 20 23 
相關問題