Filtraggio di un frame di dati


12

Stai ancora imparando le funzioni di base in R, La funzione del sottoinsieme sembra filtrare solo in base a una condizione basata su una singola colonna con o senza più condizioni?

Come posso facilmente filtrare i dati da un frame di dati?

  1. quando vengono fornite più condizioni

  2. Quando è necessario applicare la condizione tra le colonne disponibili.

Esempio: dato un frame di dati contenente

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

diciamo che voglio filtrare questo frame di dati in modo che solo i nomi in cui una delle D1 in D4 è una "E", allora dovrei avere,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

Supponiamo che D1 possa essere un grande elenco di colonne, come o qual è l'approccio consigliato per eseguire questo filtro? Grazie

Risposte:


26

Se si desidera combinare diversi filtri nella funzione del sottoinsieme , utilizzare gli operatori logici:

 subset(data, D1 == "E" | D2 == "E")

selezionerà quelle righe per le quali la colonna D1 o la colonna D2 ha valore "E". Guarda le pagine di aiuto per gli operatori logici disponibili:

 > ?"|"

Per la tua seconda domanda quello che ti serve è filtrare le righe. Ciò può essere ottenuto nel modo seguente

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

Il primo argomento da applicare si basa sulle colonne su cui dobbiamo filtrare. Il secondo argomento è 1, il che significa che stiamo eseguendo il loop tra le righe dei dati. Il terzo argomento è la funzione a una riga senza nome che restituisce VERO se "E" è presente nella riga e FALSO se "E" non è presente.

Il risultato della funzione di applicazione sarà sel vettore logico , che ha la stessa lunghezza del numero di righe nei dati. Quindi utilizziamo questo vettore per selezionare le righe necessarie.

Aggiornare

Lo stesso si può ottenere con grep:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

in R grep con argomenti predefiniti restituisce il numero di elementi nel vettore fornito che hanno il modello corrispondente.


2
un'altra utile funzione è any. Ad esempio, se vuoi verificare che almeno un elemento di un vettore sia, = 10potresti scrivere ( any(v==10)).
nico,

@nico sì, ma il 10% in% v ha 9 caratteri e una variante con qualsiasi 10 :). Sebbene per i vettori numerici sia meglio usare l'uguaglianza, poiché R è intelligente e se i tuoi dati sono numeri interi mescolati con numeri reali, riconoscerà correttamente che hai 10 nel tuo set di dati.
mpiktas,

che dire del caso dell'espressione regolare? supponendo che non desideri lavorare con una corrispondenza esatta? Hanno qualcosa vicino a ~ = come in altre lingue? ciò che è più vicino a quell'espressione in R
eastafri,

@Biorelated Vedi grepe agrep, e relativa documentazione su POSIX 1003.2 o regex compatibile con Perl.
chl

@Biorelated, ho aggiornato la risposta con l'esempio di grep.
mpiktas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.