2012-04-08 13 views
6

Ich habe einen numerischen Vektor in R, der aus negativen und positiven Zahlen besteht. Ich möchte die Zahlen in der Liste trennen, basierend auf Zeichen (Null für jetzt ignoriert), in zwei separate Listen:R: Elemente auswählen, die Kriterien aus einem Vektor entsprechen

  • ein neuer Vektor nur die negativen Zahlen
  • andere Vektor nur die positiven Zahlen, enthaltend

Die Dokumentation zeigt, wie dies für die Auswahl von Zeilen/Spalten/Zellen in einem Datenframe getan wird - aber dies funktioniert nicht mit Vektoren AFAICT.

Wie kann es gemacht werden (ohne eine for-Schleife)?

+0

Es stellte sich heraus, ich kann einfach den Namen des Vektors in den Selektionskriterien verwenden. Zum Beispiel: negs <- temp [temp <0] –

Antwort

10

Es geschieht sehr leicht (hinzugefügt Check für NaN):

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

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

Wenn Sie sowohl NA und NaN ausschließen möchten, gibt is.na() für beide wahr:

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

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

Wie ignoriere ich NaNs aus der Auswahl? –

+0

Ich habe die Antwort bearbeitet. Beachten Sie, dass d> 0 ist ein Vektor der Modus logisch, gleich für is.nan (d) und is.na (d). Das Anwenden von & auf zwei Vektoren des logischen Modus macht das "logische" Ding. –

+0

Danke, du bist ein Star! –

1

Es kann mit "eckigen Klammern" erfolgen. Ein neuer Vektor wird erstellt, der die Werte enthält, die größer als Null sind. Da ein Vergleichsoperator verwendet wird, werden Werte in Boolean angegeben. Daher werden eckige Klammern verwendet, um den genauen numerischen Wert zu erhalten.

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 Paket enthält einige nützliche Funktionen zum Filtern von Vektoren:

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 

Sie auch discard Funktion können

Verwandte Themen