2016-04-26 12 views
6

Ho il seguente dataframe (s):Rimozione sia riga e colonna del valore parziale NA

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) 

Come visibile riga 5 e colonna 5 in questo caso include solo NA e 0 valori. Vorrei ometterli e mantenere l'ordine di linee e colonne. Potrebbero esserci più colonne e righe nello stesso schema e mi piacerebbe fare lo stesso. La dimensione del dataframe potrebbe essere cambiata. Il risultato finale sarebbe:

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 

C'è un modo per ottenere la riga omessa e il numero di colonna (in questo caso 5), pure?

+1

quindi qual è il numero minimo di NA che giustifichi il dumping di una riga/colonna. Tutti i valori Non NA devono essere 0 da eliminare? –

+0

Come si può vedere si tratta di una matrice a triangolo superiore. In ogni caso, il NA sarà per le righe: dalla colonna del numero di riga all'ultima colonna (fine). E per lo stesso numero di colonna: dalla prima riga fino allo stesso numero di riga (5 in questo esempio) – Avi

+0

Questo è probabilmente ovvio, ma: dovresti usare una matrice, non un data.frame. – Frank

risposta

3

Possiamo provare

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 

Supponiamo che se cambiamo uno dei valori a 's'

s$V7[3] <- NA 

Eseguendo il codice di cui sopra, l'uscita sarà

# 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 

NOTA: le condizioni dell'OP sono e includono solo i valori NA e 0. Vorrei omettere loro

1

si potrebbe provare la seguente:

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

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

Si lavora per il seguente set di dati di abbandonare tutte le colonne e le righe che sono interamente costituiti da 0 e AN.

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

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

+0

Grazie a @SerbanTanasa. ha dovuto lavorare attraverso un paio di errori di battitura. – lmo

4

È necessario definire più su quando esattamente si desidera eliminare. In questo caso sembra matrice su un lato e diagonale sempre essere 0.

Tuttavia, in generale, questo è quello che uso

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

Considerando 0 di

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

avrei suggerire:

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

Non penso che sia corretto in quanto la risposta è basata su valori NA maggiori di 1. Potrebbe avere più di un NA con non-NA (diverso da 0). Per un esempio, se usiamo 's $ V7 [3] <- NA', allora omette quella colonna mentre la mia soluzione la mantiene. – akrun

+1

@Avi Condizione aggiunta per mantenere 0 colonne. –

+0

@akrun, la mia soluzione sembra mantenere v7 nel tuo caso di test. –

Problemi correlati