r - 如何在有条件地定义向量的情况下提高循环的速度?
问题描述
我有以下代码块,我在 for 循环中创建一个向量,条件是其他向量和数据框。我正在迭代大约 15,000 次,并且需要大量运行此代码(100 次)。现在它非常慢,所以我试图让它更快。我意识到在循环的每次迭代中使用 which() 可能效率很低,但我不确定如何更改它。我曾想过使用 apply() 函数,但不确定它们是否有助于使事情变得更快。我也一直在考虑矢量化而不是运行 for 循环。非常感谢您的时间和提前的帮助!
这是一个示例数据框temp_dat
:
MONTH ID E
1 9 19951100023401 32
2 7 19951100023401 32
3 9 19951100023402 34
4 7 19951100023402 34
5 9 19951100023403 32
6 7 19951100023403 32
7 9 19951100023903 90
8 7 19951100023903 79
9 9 19951100024403 34
10 7 19951100024403 34
我正在运行的代码是:
vector1 <- c()
x<- unique(temp_dat$ID)
for (a in 1:length(x)) {
b = x[a]
vector1[a] <- as.numeric(((temp_dat[which(temp_dat$ID == b & temp_dat$MONTH == 9),]$E %in% c(90,97)) & (temp_dat[which(temp_dat$ID == b & temp_dat$MONTH == 7),]$E %in% c(79,77))))
}
它具有作为输出向量1 的值
0 0 0 1 0
解决方案
require(data.table)
temp_dat <- as.data.table(temp_dat)
temp_dat[,
as.integer(
any(MONTH == 9 & (E %in% c(90,97))) &&
any(MONTH == 7 & (E %in% c(79,77)))
),
by = ID]$V1
推荐阅读
- mysql - 主键列不在 GROUP BY 中
- sql - XML 代码重复输出,如何实现 Distinct Values?
- google-cloud-platform - 谷歌云负载均衡器不均匀地分配流量
- jquery - 是否可以将折扣代码从购物车页面发送到 shopify 的结帐页面?
- java - 如果状态码为 403,则使用过滤器设置响应 404 的状态码
- javascript - 如何将元素移动到对象数组的顶部?
- javascript - javascript将许多空格合并为一个,例如HTML?奇怪的行为
- python - 清理从扫描的 .pdf 中提取的文本数据
- numpy - 如何阅读 Numpy 文档
- javascript - 找不到选择器的节点 // Puppeteer 错误