将低于阈值的值转换为1

89_*_*ple 4 if-statement r

假设我有以下数据

x <- rnorm(100)
Run Code Online (Sandbox Code Playgroud)

我想创建另一个列,其中if x等于或大于0.2,给它一个值1或者0.

akr*_*run 7

我们可以创建逻辑条件并使用 +

xNew <- +(x >=0.2)
Run Code Online (Sandbox Code Playgroud)

如果我们需要data.frame,

dat <- data.frame(x, xNew)
Run Code Online (Sandbox Code Playgroud)

或者使用 ifelse

xNew <- ifelse(x >= 0.2, 1, 0) 
Run Code Online (Sandbox Code Playgroud)

  • 将逻辑值转换为数字是一种巧妙的方式.你也可以使用`as.numeric` (3认同)

小智 6

您想使用Heaviside功能.例如,您可以在fbasics包中找到它.

set.seed(42)
x <- rnorm(100)
library(fBasics)
Heaviside(x, 0.2)
Run Code Online (Sandbox Code Playgroud)


hrb*_*str 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
Run Code Online (Sandbox Code Playgroud)

如果您完全关心性能,那么Heaviside完全不是您想要做的事情.并且,它只是做:

function (x, a = 0) {
  result = (sign(x - a) + 1)/2
  result
}
Run Code Online (Sandbox Code Playgroud)

无论如何.