对向量的某些元素执行运算

时间:2019-04-24 08:05:00

标签: r vectorization

我知道如何在R中从满足某些给定条件的向量中“提取”某些元素-例如:

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使用矢量化了。

3 个答案:

答案 0 :(得分:3)

这是精打细算的工作:

# 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

答案 1 :(得分:2)

您可以使用

(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乘以1的值,而TRUE乘以1的值。因此,大于25的数字乘以10,而小于25的数字乘以0。


作为ifelse的替代方法,我们也可以使用replace

replace(x * 10, x <= 25, 0)      
#[1]   0   0 300 400 

对长度为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,我们可以

c(1, 10)[(x > 25) + 1] * x
#[1]  10  20 300 400

答案 2 :(得分:1)

我想出了办法。我认为对于每天使用R的人来说,这很容易。我将其发布在这里,以防万一它有助于某人:

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

结果:

[1]   0   0 300 400

希望您发现它有用。