2013-09-03 5 views
6

Supponiamo di avere un set di dati con 100 colonne dispari e ho bisogno di mantenere solo quelle righe nei dati che soddisfano una condizione applicata su tutte le 100 colonne. Come faccio?Filtrare le righe in base a più condizioni di colonna R

Supponiamo, è come sotto ... devo mantenere solo righe in cui uno di Col1 o 2 o 3 o 4 è> 0

Col1 Col2 Col3 Col4 
1 1 3 4 
0 0 4 2 
4 3 4 3 
2 1 0 2 
1 2 0 3 
0 0 0 0 

Nell'esempio sopra, ad eccezione dell'ultima fila tutte le righe renderà .. Ho bisogno di mettere i risultati nello stesso dataframe originale. Non so se posso usare il lapply per scorrere le colonne dove> 0 o I posso usare sottoinsieme. Qualsiasi aiuto è apprezzato

Posso usare gli indici delle colonne e fare df<-subset(df,c(2:100)>0). Questo non mi dà il risultato giusto.

risposta

11

Supponiamo che il tuo data.frame sia DF quindi utilizzare [ farà il lavoro per voi.

> DF[DF[,1]>0 | DF[,2] >0 | DF[,3] >0 | DF[,4] >0, ] 
    Col1 Col2 Col3 Col4 
1 1 1 3 4 
2 0 0 4 2 
3 4 3 4 3 
4 2 1 0 2 
5 1 2 0 3 

Se si dispone di centinaia di colonne è possibile utilizzare questo approccio alternativo

> DF[rowSums(DF)=!0, ] 
    Col1 Col2 Col3 Col4 
1 1 1 3 4 
2 0 0 4 2 
3 4 3 4 3 
4 2 1 0 2 
5 1 2 0 3 
+1

Ehi Jilber, che cosa se ho 100 colonne dispari, dovrei digitare la roba 100 volte .. Non sono sicuro che avrei? essere ideale ... per favore fatemi sapere – kaos1511

+0

Se avete molti vettori, dovete creare un data frame o una matrice ... –

+0

Mentre la prima soluzione funziona con tutti i numeri reali, la seconda soluzione è limitata a numeri non negativi. –

2
dat <- read.table(header = TRUE, text = " 
    Col1 Col2 Col3 Col4 
    1 1 3 4 
    0 0 4 2 
    4 3 4 3 
    2 1 0 2 
    1 2 0 3 
    0 0 0 0 
") 

È possibile utilizzare data.table per accogliere automaticamente tuttavia molte colonne tuo data.frame succede ad avere. Ecco un modo, ma c'è probabilmente un metodo più elegante di fare questo con data.table:

require(data.table) 
dt <- data.table(dat) 

dt[rowSums(dt>0)>0] 

# Col1 Col2 Col3 Col4 
# 1: 1 1 3 4 
# 2: 0 0 4 2 
# 3: 4 3 4 3 
# 4: 2 1 0 2 
# 5: 1 2 0 3