2015-03-12 3 views
1

У меня есть бывший. где я должен видеть, как много значений вектора, делятся на 2. У меня есть эта случайная выборка:Сколько значений вектора делится на 2? Использовать R

set.seed(1) 
y <- sample(c(0:99, NA), 400, replace=TRUE) 

я создал новую переменную D, чтобы увидеть, какие из значений являются или не являются делится на 2:

d <- y/2 ; d 

Что я хочу сделать, так это создать логический аргумент, где все целые числа выдают true, а остальное дает false. (Например: 22,0 -> ИСТИНА & +24,5 -> FALSE)

Я использовал эту команду, но я считаю, что ответ неверен, так как это будет только дать мне номера, которые находятся в образце:

Я также попытался это (я нашел в Интернете, но я не очень понимаю)

is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol 
sum(is.wholenumber(d),na.rm = T) 

существуют другие способы, которые я мог бы использовать оператор «%%»?

ответ

3

можно суммировать по модулю оператора, как так: sum(1-y%%2) или sum(y%%2 == 0). Обратите внимание, что x %% 2 - это остаток после деления на два, поэтому это решение работает.

+0

Спасибо! Он работал отлично, я просто добавил: sum (y %% 2 == 0, na.rm = T), так как в выборке есть значения NA. – rebeca

2

Вот три различных способа:

  1. length(y[y %% 2 == 0])
  2. length(subset(y, y %% 2 == 0))
  3. length(Filter(function(x) x %% 2 == 0, y))
2

Поскольку мы говорим о делении на 2, я бы взял его на уровень бит и проверил, является ли последний бит числа 0 или 1 (a означает, что он будет делиться на 2) ,

Выйти на конечность здесь (не знаете, как компилятор справляется с этим делением на 2), но подумайте, что это скорее оптимизируется, чем деление, которое обычно довольно дорого.

Чтобы сделать это на уровне битов, вы можете просто сделать операции И между самим номером и 1, если результат его 1 это означает, что не будет делиться на 2:

bitwAnd(a, b) 

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

  • Нет связанных вопросов^_^