2015-10-05 2 views

ответ

6

мы можем создать логическое условие и обертывание с +

xNew <- +(x >=0.2) 

Если нам нужен data.frame,

dat <- data.frame(x, xNew) 

Или используйте ifelse

xNew <- ifelse(x >= 0.2, 1, 0) 
+0

Как работает «упаковка в +»? – user1945827

+1

преобразует TRUE или FALSE в целое число -> либо 0 для FALSE, либо 1 для TRUE – maRtin

+1

@ user1945827 Логический TRUE/FALSE привязывается к двоичному 1/0 с помощью '+' – akrun

6

Вы хотите использовать функцию Хевисайда. Например, вы можете найти его в пакете fbasics.

set.seed(42) 
x <- rnorm(100) 
library(fBasics) 
Heaviside(x, 0.2) 
+0

аккуратный способ. Это должно быть решением. –

+0

@ColonelBeauvel Что случилось с моим подходом? – akrun

+1

ничего, потому что это дает результат! Но математическая оценка намного опережающая, чем ИТ-(и функция говорит сама по себе, немного более функциональное программирование) :) –

6

Делать это в пользу полковника:

library(microbenchmark) 

set.seed(1492) 
x <- rnorm(10000) 

microbenchmark(asi=as.integer(x >= 0.2), 
       asn=as.numeric(x >= 0.2), 
       pls=+(x >=0.2), 
       hsd=Heaviside(x, 0.2)) 

## Unit: microseconds 
## expr min  lq  mean median  uq  max neval cld 
## asi 18.351 20.7575 27.88867 22.4250 22.8695 598.206 100 a 
## asn 23.710 25.9740 32.77422 29.2405 29.9860 340.234 100 a 
## pls 17.989 20.2640 26.07038 22.6855 23.3020 320.443 100 a 
## hsd 88.493 92.2145 148.17850 94.1935 95.5250 2831.695 100 b 

Хевисайда полностью не то, что вы хотите делать, если вы заботитесь на все о производительности. И это просто:

function (x, a = 0) { 
    result = (sign(x - a) + 1)/2 
    result 
} 

в любом случае.

+0

Сравнение '+' с 'as.numeric' не является хорошим сравнением. Первая возвращает «целое число». – Roland

+0

Humm, я просто назвал операцию ... –

+0

@Roland исправлена. спасибо. – hrbrmstr