Допустим, если у меня есть следующие данныеПреобразовать значения ниже порогового значения в 1
x <- rnorm(100)
Я хочу, чтобы создать еще один столбец, где, где, если x
равно или больше 0,2, дают ему значение 1 или еще 0.
Допустим, если у меня есть следующие данныеПреобразовать значения ниже порогового значения в 1
x <- rnorm(100)
Я хочу, чтобы создать еще один столбец, где, где, если x
равно или больше 0,2, дают ему значение 1 или еще 0.
мы можем создать логическое условие и обертывание с +
xNew <- +(x >=0.2)
Если нам нужен data.frame
,
dat <- data.frame(x, xNew)
Или используйте ifelse
xNew <- ifelse(x >= 0.2, 1, 0)
Вы хотите использовать функцию Хевисайда. Например, вы можете найти его в пакете fbasics
.
set.seed(42)
x <- rnorm(100)
library(fBasics)
Heaviside(x, 0.2)
аккуратный способ. Это должно быть решением. –
@ColonelBeauvel Что случилось с моим подходом? – akrun
ничего, потому что это дает результат! Но математическая оценка намного опережающая, чем ИТ-(и функция говорит сама по себе, немного более функциональное программирование) :) –
Делать это в пользу полковника:
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
}
в любом случае.
Как работает «упаковка в +»? – user1945827
преобразует TRUE или FALSE в целое число -> либо 0 для FALSE, либо 1 для TRUE – maRtin
@ user1945827 Логический TRUE/FALSE привязывается к двоичному 1/0 с помощью '+' – akrun