2016-09-15 3 views
1

ich mit einem Daten beschäftigt gewesen sein, die wie untenwie Zeilen zu entfernen, wenn sie keine Kriterien erfüllen

df<- structure(list(V1 = structure(1:6, .Label = c("A", "B", "C", 
"D", "E", "F"), class = "factor"), V2 = structure(1:6, .Label = c("AA", 
"BB", "CC", "DD", "EE", "FF"), class = "factor"), V3 = structure(c(6L, 
5L, 4L, 1L, 3L, 2L), .Label = c("hddu", "jfhu", "jshsg", "kduf", 
"Tlsu", "Trsm"), class = "factor"), V4 = c(1L, 2L, 0L, 0L, 5L, 
6L), V5 = c(0L, 2L, 0L, 4L, 0L, 5L), V6 = c(0L, 0L, 4L, 6L, 0L, 
7L), V7 = c(0L, 0L, 5L, 0L, 0L, 8L), V8 = c(0L, 0L, 0L, 0L, 6L, 
0L), V9 = c(0L, 0L, 0L, 7L, 0L, 0L)), .Names = c("V1", "V2", 
"V3", "V4", "V5", "V6", "V7", "V8", "V9"), class = "data.frame", row.names = c(NA, 
-6L)) 

sieht aus wie dieses

V1 V2 V3 V4 V5 V6 V7 V8 V9 
1 A AA Trsm 1 0 0 0 0 0 
2 B BB Tlsu 2 2 0 0 0 0 
3 C CC kduf 0 0 4 5 0 0 
4 D DD hddu 0 4 6 0 0 7 
5 E EE jshsg 5 0 0 0 6 0 
6 F FF jfhu 6 5 7 8 0 0 

sieht das, was ich will, ist zu entfernen Zeilen, die für mindestens zwei aufeinanderfolgende Spalten keinen Wert haben. Zum Beispiel sollten sie für die erste 2 Spalte haben, oder zweite zwei Spalten oder dritte zwei Spalten, wenn sie mehr haben, ist es in Ordnung. Ich möchte, sie erkennen, und auch einen Ausgang zu machen, ohne sie in diesem Fall

Zeilennummer 1, 4 und 5, so muß zwei Ausgänge I

1- Index 1, 4 und 5 (dies zeigt, welche Zeilen entfernt) 2- Die erwartete Ausgang ist wie dieser

B BB Tlsu 2 2 0 0 0 0 
C CC kduf 0 0 4 5 0 0 
F FF jfhu 6 5 7 8 0 0 
+3

Für Ihre Eingabe haben alle Zeilen Wert für alle Spalten. Erkläre, was du wirklich brauchst. Was meinst du mit "keinen Wert für eine Spalte haben"? – user31264

+1

@ user31264 mein ich nicht 0 zu haben – nik

+0

Wenn Sie gemeint haben, keine Null, was ist dann mit der 4. Reihe? – akrun

Antwort

1

Sie manuell zwei Daten abholen können Frames mit dem Index, die durch eine sich horizontal verschieben und & vektorisiert verwenden, um herauszufinden, ob es eine fortlauf TRUE ist und Sammeln Sie den reihenweisen Zustand mit rowSums als Filterindex:

df[rowSums(df[4:8] & df[5:9]) != 0, ] 

# V1 V2 V3 V4 V5 V6 V7 V8 V9 
# 2 B BB Tlsu 2 2 0 0 0 0 
# 3 C CC kduf 0 0 4 5 0 0 
# 4 D DD hddu 0 4 6 0 0 7 
# 6 F FF jfhu 6 5 7 8 0 0 

Wenn die Spalten haben jede andere Spalte gekoppelt werden kann seq verwendet werden, notwendig Index zu generieren:

df[rowSums(df[seq(4, 9, 2)] & df[seq(5, 9, 2)]) != 0, ] 

# V1 V2 V3 V4 V5 V6 V7 V8 V9 
#2 B BB Tlsu 2 2 0 0 0 0 
#3 C CC kduf 0 0 4 5 0 0 
#6 F FF jfhu 6 5 7 8 0 0 
+0

haben, das ist eine sehr gute Lösung, aber nicht vollständig richtig. Sie haben Zeile Nummer 4, die nicht in der Ausgabe sein sollte. Sie müssen mindestens in Spalte V4 und V5 oder V6 und V7 oder V8 und V9 Werte (nicht Null) haben. – nik

+0

Überprüfen Sie die aktualisierte Antwort. Es gibt ein Update zur Paarung jeder anderen Spalte. – Psidom

1

Die Logik ist nicht klar. Aber das scheint zu funktionieren

df[Reduce(`|`, Map(`&`, df[-(1:3)][c(TRUE, FALSE)], df[-(1:3)][c(FALSE, TRUE)])),] 
# V1 V2 V3 V4 V5 V6 V7 V8 V9 
#2 B BB Tlsu 2 2 0 0 0 0 
#3 C CC kduf 0 0 4 5 0 0 
#6 F FF jfhu 6 5 7 8 0 0 
Verwandte Themen