我知道如何在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
使用矢量化了。
答案 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
希望您发现它有用。