2012-04-08 4 views
6

У меня есть числовой вектор в R, который состоит из отрицательных и положительных чисел. Я хочу, чтобы отделить номера в списке на основе знака (не обращая внимания ноль на данный момент), в двух отдельных списков:R: выбор элементов соответствия критериям от вектора

  • новый вектор, содержащий только отрицательные числа
  • другой вектор, содержащий только положительные числа

В документации показано, как это сделать для выбора строк/столбцов/ячеек в фрейме данных, но это не работает с векторами AFAICT.

Как это сделать (без петли)?

+0

Оказывается, я могу просто использовать имя вектора в критериях выбора. Например: negs <- temp [temp <0] –

ответ

10

Это делается очень легко (добавлена ​​проверка NaN):

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

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

Если вы хотите исключить как NA и NaN, is.na() возвращает истину как:

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

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

Как игнорировать NaN из выделения? –

+0

Я отредактировал ответ. Заметим, что d> 0 - вектор режима логический, тот же для is.nan (d) и is.na (d). Применение & к двум векторам логического режима делает «логическую» вещь. –

+0

Спасибо, ты звезда! –

1

It можно сделать, используя «квадратные скобки». Создается новый вектор, который содержит те значения, которые больше нуля. Поскольку используется оператор сравнения, он будет обозначать значения в булевом. Поэтому квадратные скобки используются для получения точного числового значения.

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 пакет включает в себя ряд полезных функций для фильтрации векторов:

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 

Вы также можете использовать discard функции

Смежные вопросы