2012-04-08 14 views
6

Mam wektor numeryczny w R, który składa się z liczb ujemnych i dodatnich. Chcę oddzielić numery z listy na podstawie znaku (pomijając zero dla teraz), w dwóch oddzielnych list:R: wybieranie pozycji spełniających kryteria z wektora

  • nowy wektor zawierający tylko liczby ujemne
  • inny wektor zawierający tylko dodatnie liczby

Dokumentacja pokazuje, jak to zrobić, aby wybrać wiersze/kolumny/komórki w ramce danych - ale to nie działa z wektorami AFAICT.

Jak to zrobić (bez pętli for)?

+0

okazuje, można po prostu użyć nazwy wektora w kryteriach wyboru. Dla np .: negs <- temp [temp <0] –

Odpowiedz

10

Stało się bardzo łatwo (dodane czek na NaN):

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

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

Jeśli chcesz wykluczyć zarówno NA i NaN, is.na() zwraca true dla obu:

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

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

jak zignorować NaN z wyboru? –

+0

Edytowałem odpowiedź. Zwróć uwagę, że d> 0 jest wektorem trybu logicznego, to samo dla is.nan (d) i is.na (d). Zastosowanie & do dwóch wektorów trybu logicznego prowadzi do "logicznej" rzeczy. –

+0

Dzięki, jesteś gwiazdą! –

1

It można to zrobić za pomocą "nawiasów kwadratowych". Tworzy się nowy wektor zawierający wartości większe od zera. Ponieważ używany jest operator porównania, będzie on oznaczać wartości w Boolean. W związku z tym do uzyskania dokładnej wartości liczbowej używane są nawiasy kwadratowe.

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 pakiet zawiera kilka użytecznych funkcji filtrowania wektorów:

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 

Można użyć także discard funkcji

Powiązane problemy