2012-04-08 10 views
6

Ho un vettore numerico in R, che consiste sia di numeri negativi che di numeri positivi. Io voglio separare i numeri della lista sulla base di segno (ignorando lo zero per ora), in due liste separate:R: selezione di elementi corrispondenti ai criteri di un vettore

  • un nuovo vettore contenente solo i numeri negativi
  • un altro vettore che contiene solo i numeri positivi

La documentazione mostra come eseguire questa operazione per selezionare righe/colonne/celle in un dataframe, ma questo non funziona con i vettori AFAICT.

Come può essere eseguito (senza ciclo for)?

+0

Risulta, posso usare semplicemente il nome del vettore nei criteri di selezione. Ad esempio: negs <- temp [temp <0] –

risposta

10

E 'fatto molto facilmente (assegno aggiunto per NaN):

d <- c(1, -1, 3, -2, 0, NaN) 

positives <- d[d>0 & !is.nan(d)] 
negatives <- d[d<0 & !is.nan(d)] 

Se si vuole escludere sia NA e NaN, is.na() restituisce vero per entrambi:

d <- c(1, -1, 3, -2, 0, NaN, NA) 

positives <- d[d>0 & !is.na(d)] 
negatives <- d[d<0 & !is.na(d)] 
+0

come faccio a ignorare i NaN dalla selezione? –

+0

Ho modificato la risposta. Nota che d> 0 è un vettore di modalità logico, lo stesso per is.nan (d) e is.na (d). L'applicazione di & a due vettori di modalità logica fa la cosa "logica". –

+0

Grazie, sei una stella! –

1

E' può essere fatto usando "parentesi quadre". Viene creato un nuovo vettore che contiene quei valori che sono maggiori di zero. Poiché viene utilizzato un operatore di confronto, esso indicherà i valori in Booleano. Quindi le parentesi quadre vengono utilizzate per ottenere l'esatto valore numerico.

pacchetto
d_vector<-(1,2,3,-1,-2,-3) 
new_vector<-d_vector>0 
pos_vector<-d_vector[new_vector] 
new1_vector<-d_vector<0 
neg_vector<-d_vector[new1_vector] 
0

purrr include alcune funzioni utili per i vettori filtraggio:

library(purrr) 
test_vector <- c(-5, 7, 0, 5, -8, 12, 1, 2, 3, -1, -2, -3, NA, Inf, -Inf, NaN) 

positive_vector <- keep(test_vector, function(x) x > 0) 
positive_vector 
# [1] 7 5 12 1 2 3 Inf 

negative_vector <- keep(test_vector, function(x) x < 0) 
negative_vector 
# [1] -5 -8 -1 -2 -3 -Inf 

È possibile utilizzare anche discard funzione

Problemi correlati