2016-04-12 10 views
1

Ich möchte Zeilen mit mindestens 2 aufeinander folgenden Nullen aus meinem Datenrahmen ausschließen. Beispiel:Das Ausschließen von Zeilen mit fortlaufenden Nullen aus dem Datenrahmen

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

Ich mag würde den Versuch für Stimulus B mit zwei Nullen auszuschließen, aber die Werte für C nur eine enthält halten. Bisher habe ich versucht:

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

aber es sagt mir, es ist ein ungültiges Argument Typ. Gibt es eine "einfache" Möglichkeit, Zeilen mit fortlaufenden Nullen auszuschließen?

Vielen Dank im Voraus.

+0

Auch wenn ich die Bahn vorher gescannt, habe ich jetzt die richtigen Keywords und fand die gleiche Frage hier gestellt: http://stackoverflow.com/questions/11797216/r-count-number-of-zeros- per-row-and-remove-alle-row-more-than-5-zeros In meinem Fall wäre die Antwort: 'df [rowSums (df == 0) <= 2,]' – cRazyMind

+2

das nicht tut zu berücksichtigen, ob sie "aufeinanderfolgend" sind. – mtoto

Antwort

2

Wenn wir in jeder Zeile nach fortlaufenden Nullen suchen und diese Zeile ausschließen möchten, besteht eine Möglichkeit darin, die Zeilen mit apply und MARGIN=1 zu durchlaufen. Überprüfen Sie, ob any der benachbarten Elemente gleich sind und Null sind, die Negation durchführen und die Zeilen unterteilen.

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 

oder wenn wir aufeinanderfolgende Null-Länge benötigen ‚n‘ sein soll, dann kann rle auf jede Zeile angewendet werden, ob die lengths für ‚Werte‘, die 0 ist, ‚n‘, negieren und Teilmenge die Zeilen.

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 
Verwandte Themen