image.png
我们的所有操作,都可以对向量的每一个元素执行。
同样的操作也可以用来取子集:
一般来说,c() 是创建向量的语法,但R 也提供了一些例外:可不要因为它们养成坏习惯了哦。
我觉得下面的内容讲的更全:https://www.yuque.com/mugpeng/rr/01r-de-bian-cheng-xiao-lu
这里提一下Vectorize函数,可以将标量(接受单一参数的)函数转换为向量化形式:
if_else_statement <- function(vec_element) {
if(vec_element == "Fire") {
vec_element = "hot"
} else {
vec_element = "cold"
}
return(vec_element)
}
vectorized_if_else <- base::Vectorize(if_else_statement)
test001 <- c(rep("Fire", 100000), rep("Ice", 200000))
system.time(sapply(test001, if_else_statement))
system.time(vectorized_if_else(test001))
system.time(ifelse(test001 == "Fire", "hot", "cold"))
这里顺便再比较了另外两种向量化操作的方式:
> system.time(sapply(test001, if_else_statement))
用户 系统 流逝
0.471 0.036 0.669
> system.time(vectorized_if_else(test001))
用户 系统 流逝
0.434 0.020 0.572
> system.time(ifelse(test001 == "Fire", "hot", "cold"))
用户 系统 流逝
0.070 0.005 0.086
这里有人还做了一张图:https://thatdatatho.com/vectorization-r-purrr/#:~:text=base%3A%3AVectorize%20%28%29%20converts%20a%20scalar%20function%20to%20a,vectorize%20functions%20would%20be%20with%20the%20purrr%20package.
可见还是尽量不要用Vectorize 做向量化操作呀。
但其实有的如cumsum cumprod 等也考虑到了一些基本的运算。
尽量避免循环和嵌套次数。
我竟然一直喜爱的apply 其实是:
★A common reflex is to use a function in the apply family. This is not vectorization, it is loop-hiding. The apply function has a for loop in its definition.”
image.png
所以本质还是空间与时间的tradeoff。
当然了。
但如果,花两小时时间将lapply 修改为doLapply 就为了提高脚本0.1s 的速度,我劝你还不如打两把游戏。
image.png