从数据框中排除包含连续零的行

时间:2016-04-12 08:35:45

标签: r

我想从我的数据框中排除至少有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]

但它告诉我这是一个无效的参数类型。有没有&#34;容易&#34;如何完成排除连续零的行?

提前谢谢。

1 个答案:

答案 0 :(得分: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

或者,如果我们需要连续零长度为&#39; n&#39;,则可以将rle应用于每一行,检查lengths是否为&#39;值&#39 ; 0是&#39; n&#39;,否定行的子集。

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