我想从我的数据框中排除至少有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;如何完成排除连续零的行?
提前谢谢。
答案 0 :(得分:2)
如果我们要在每行中查找任何连续的零并想要排除该行,则一种方法是使用apply
和MARGIN=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