对矢量的某些元素执行操作

问题描述 投票:2回答:3

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

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

r vectorization
3个回答
3
投票

这是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

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被评估为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

1
投票

我想到了如何做到这一点。我想对于那些每天与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

希望你觉得它有用。

© www.soinside.com 2019 - 2024. All rights reserved.