2016-04-26 9 views
6

Ich habe folgenden Datenrahmen (s):beid Reihen- und Spaltenteil NA-Wert Entfernen

s<-read.table(text = "V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 
    1 0 62 64 44 NA 55 81 66 57 53 
    2 0 0 65 50 NA 56 79 69 52 55 
    3 0 0 0 57 NA 62 84 76 65 59 
    4 0 0 0 0 NA 30 70 61 41 36 
    5 0 0 0 0 NA NA NA NA NA NA 
    6 0 0 0 0 0 0 66 63 51 44 
    7 0 0 0 0 0 0 0 80 72 72 
    8 0 0 0 0 0 0 0 0 68 64 
    9 0 0 0 0 0 0 0 0 0 47 
    10 0 0 0 0 0 0 0 0 0 0 ", header = TRUE) 

Als Zeile 5, und Spalte 5 in diesem Fall gesehen werden kann, schließt nur NA und 0 Werte. Ich möchte sie weglassen und die Reihenfolge der Zeilen und Spalten beibehalten. Es könnte mehr Spalten und Reihen im selben Muster geben und ich würde das Gleiche tun. Die Größe des Datenrahmens könnte geändert werden. Das Endergebnis wäre:

V1 V2 V3 V4 V6 V7 V8 V9 V10 
1 0 62 64 44 55 81 66 57 53 
2 0 0 65 50 56 79 69 52 55 
3 0 0 0 57 62 84 76 65 59 
4 0 0 0 0 30 70 61 41 36 
6 0 0 0 0 0 66 63 51 44 
7 0 0 0 0 0 0 80 72 72 
8 0 0 0 0 0 0 0 68 64 
9 0 0 0 0 0 0 0 0 47 
10 0 0 0 0 0 0 0 0 0 

Gibt es eine Möglichkeit, die versäumte Zeilen- und Spaltennummer zu erhalten (in diesem Fall 5), wie auch?

+1

also was ist die minimale nr von NA, die rechtfertigen würde, eine Zeile/Spalte dumping. Müssen alle Nicht-NA-Werte 0 sein, um fallen zu lassen? –

+0

Wie zu sehen ist, ist es eine obere Dreiecksmatrix. In jedem Fall gilt die NA für die Zeilen: von der Zeilennummer bis zur letzten Spalte (Ende). Und für die gleiche Spalte Nummer: von der ersten Zeile bis zur gleichen Zeilennummer (5 in diesem Beispiel) – Avi

+0

Das ist wahrscheinlich offensichtlich, aber: Sie sollten eine Matrix verwenden, nicht ein data.frame. – Frank

Antwort

3

Wir können versuchen,

v1 <- colSums(is.na(s)) 
v2 <- colSums(s==0, na.rm=TRUE) 
j1 <- !(v1>0 & (v1+v2)==nrow(s) & v2 >0) 

v3 <- rowSums(is.na(s)) 
v4 <- rowSums(s==0, na.rm=TRUE) 
i1 <- !(v3>0 & (v3+v4)==ncol(s) & v3 >0) 
s[i1, j1] 
# V1 V2 V3 V4 V6 V7 V8 V9 V10 
#1 0 62 64 44 55 81 66 57 53 
#2 0 0 65 50 56 79 69 52 55 
#3 0 0 0 57 62 84 76 65 59 
#4 0 0 0 0 30 70 61 41 36 
#6 0 0 0 0 0 66 63 51 44 
#7 0 0 0 0 0 0 80 72 72 
#8 0 0 0 0 0 0 0 68 64 
#9 0 0 0 0 0 0 0 0 47 
#10 0 0 0 0 0 0 0 0 0 

Angenommen, wenn wir einen der Werte in 's'

s$V7[3] <- NA 

Durch den obigen Code ausgeführt wird ändern, wird der Ausgang sein

# V1 V2 V3 V4 V6 V7 V8 V9 V10 
#1 0 62 64 44 55 81 66 57 53 
#2 0 0 65 50 56 79 69 52 55 
#3 0 0 0 57 62 NA 76 65 59 
#4 0 0 0 0 30 70 61 41 36 
#6 0 0 0 0 0 66 63 51 44 
#7 0 0 0 0 0 0 80 72 72 
#8 0 0 0 0 0 0 0 68 64 
#9 0 0 0 0 0 0 0 0 47 
#10 0 0 0 0 0 0 0 0 0 

HINWEIS: Die OP-Bedingung lautet enthält nur NA- und 0-Werte. Ich möchte sie

1

Sie versuchen, die folgenden könnte wegzulassen:

myRowSums <- rowSums(is.na(s) | s == 0) 
myColSums <- colSums(is.na(s) | s == 0) 

sSmall <- s[which(myRowSums != ncol(s)), which(myColSums != nrow(s))] 

Es ist für die folgenden Daten-Set arbeitet alle Spalten und Zeilen zu löschen, die aus 0en und NAs völlig hergestellt werden.

s <- data.frame(a=c(0, rnorm(5), 0), b=c(0, rnorm(2), NA, NA,1, NA), c=c(rep(c(0,NA), 3), 0)) 
+1

versuche 'sSmall <- s [myRowSums! = Ncol (s), meineColSums! = Nrow (s)]' –

+0

Danke @SerbanTanasa. musste ein paar Tippfehler durcharbeiten. – lmo

4

Sie müssen mehr definieren wann genau Sie ablegen möchten. In diesem Fall ist es wie Matrix auf der einen Seite und diagonal immer 0 sind

jedoch Generell sieht, ist das, was ich

s[!rowSums(is.na(s))>1,!colSums(is.na(s))>1] 

Anbetracht 0'en

s[!rowSums(is.na(s)|s==0)>9,!colSums(is.na(s)|s==0)>9] 
3

Ich wollte verwenden, um vorschlagen:

sclean <- s[rowSums(s == 0|is.na(s)) != ncol(s) | (rowSums(s == 0, na.rm=TRUE) == ncol(s)), 
     colSums(s == 0|is.na(s))!= nrow(s) | colSums(s == 0, na.rm=TRUE) == nrow(s)] 
+0

Ich denke nicht, dass das richtig ist, da die Antwort auf NA-Werten größer als 1 basiert. Es könnte mehr als eine NA mit Nicht-NA (außer 0) haben. Für ein Beispiel, wenn wir 's $ V7 [3] <- NA' machen, dann wird diese Spalte weggelassen, während meine Lösung sie behält. – akrun

+1

@Avi Zusätzliche Bedingung, um 0 Spalten zu behalten. –

+0

@akrun, scheint meine Lösung v7 in Ihrem Testfall zu halten. –