r - R矢量化操作
问题描述
我想获取数据帧的一列的每个元素(一个数字),通过将它乘以一个向量来获得一个向量,然后将它乘以数据帧中的每一行,将其转换为一个向量。
代码如下:
df = data.frame(matrix(rexp(1441*100, rate=.1), ncol=100))
out_vec <- c()
for (i in 1:nrow(df)) {
out_vec[i]<- sum(df[i, 5:100] * (1 + abs(df$X1[i])/100) ^ -(0:95 / 12))
}
我怎样才能矢量化这段代码?我努力了
out_vec_alt <- rowSums(df[, 5:100] * (1 + abs(df$X1)/100) ^ -(0:95 / 12))
但它没有产生预期的结果:
all(out_vec_alt == out_vec) #FALSE
解决方案
第二部分需要完成outer
。您可以a^b
以矢量化方式使用,但它不会将操作应用于 vs 的所有元素的第一个元素、a
vs 的所有元素的b
第二个元素等,就像您在这种情况下想要的那样。它只会给。a
b
c(a[1]^b[1], a[2]^b[2], ..., a[n]^b[n])
out_vec2 <- rowSums(df[5:100] * outer(1 + abs(df$X1)/100, -(0:95)/12, `^`))
all.equal(out_vec, out_vec2)
# [1] TRUE
显然这会更快,但我很惊讶地看到这个例子的速度超过了 200 倍(在中位时间)
loop <- function(){
out_vec <- c()
for (i in 1:nrow(df)) {
out_vec[i]<- sum(df[i, 5:100] * (1 + abs(df$X1[i])/100) ^ -(0:95 / 12))
}
out_vec
}
vect <- function() rowSums(df[5:100] * outer(1 + abs(df$X1)/100, -(0:95)/12, `^`))
library(microbenchmark)
microbenchmark(loop(), vect(), times = 10)
# Unit: milliseconds
# expr min lq mean median uq max neval
# loop() 12065.34780 12756.12062 13095.97435 12892.87818 13460.56978 15030.0197 10
# vect() 35.73011 41.36212 60.57327 54.40029 79.25182 104.0453 10
推荐阅读
- javascript - 是否可以使用打字稿声明泛型反应功能组件?
- ssl - 如何在 OpenSSL 库中指定用于 SSL 功能的引擎?
- r - 加权后将均值应用于列表
- java - 如何将 Google json 密钥文件配置为 Spring 核心资源?
- axios - Vue axios 执行 Then 中的代码。为什么?
- php - 在 Laravel API Sanctum 中验证 Vue SPA 的问题
- vue.js - 如何添加基于状态的验证?
- python - 将相同的整数分配给数据库中表的特定字符串
- python - 为什么最好的损失没有更新?
- reactjs - _React$useContext 在 app.js 组件上未定义