我知道如何从满足某些给定条件的向量中“提取”某些元素,例如:
x = c(10, 20, 30, 40)
x[x<25]
结果:
[1] 10 20
我想要的是将一个操作应用于向量的某些给定元素,而无需修改或丢失其余元素。例如:
x = c(10, 20, 30, 40)
y = numeric(length(x)) # create a vector with as many zeros as elements in `x`
现在,我想让y[i]
等于x[i]
的10倍,当然,只有x[i]>25
,使用矢量化。
这是ifelse的工作:
# Your data
x = c(10, 20, 30, 40)
# Multiplying with ten if condition is met else zero
ifelse(x>25, x*10, 0)
[1] 0 0 300 400
你可以用
(x > 25) * (10 * x)
#[1] 0 0 300 400
打破它
(x > 25) #gives
#[1] FALSE FALSE TRUE TRUE
(10 * x)
#[1] 100 200 300 400
现在,当你将它们相乘时,FALSE
被评估为0而TRUE
被评估为1.因此大于25的数字乘以10而小于等于25的数字乘以0。
作为ifelse
的替代品,我们也可以使用replace
replace(x * 10, x <= 25, 0)
#[1] 0 0 300 400
基于长度qazxsw poi数据的基准测试
1e6
万一,如果我们想保持set.seed(1234)
x <- sample(1:50, 1e6, replace = TRUE)
library(microbenchmark)
microbenchmark(mul = (x > 25) * (10 * x),
ifelse = ifelse(x>25, x*10, 0),
replace = replace(x * 10, x <= 25, 0))
Unit: milliseconds
# expr min lq mean median uq max neval cld
# mul 6.654335 12.74489 15.93877 14.22821 15.03979 70.48483 100 a
# ifelse 89.945089 112.12242 126.15313 120.03759 135.84350 432.44697 100 c
#replace 11.711879 18.30549 27.78782 20.75061 21.96056 395.21573 100 b
原样,只改变x
我们可以做
x > 25
我想到了如何做到这一点。我想对于那些每天与R一起工作的人来说很容易;我在这里发布,以防万一它可以帮助某人:
c(1, 10)[(x > 25) + 1] * x
#[1] 10 20 300 400
结果:
x = c(10, 20, 30, 40)
y = numeric(length(x)) # create a vector with as many zeros as elements in `x`
ii = (x>25) # vector of boolean values
y[ii] = 10*x[ii] # performs the operation only on/for those elements for which `ii` is true
y
希望你觉得它有用。