r - 如何在 R 中为这个嵌套的 for 循环编写更有效的代码?

标签 r for-loop vectorization

尝试计算 p1(实验组中的事件)和 p0(对照组中的事件)与 or(优势比)的组合) 的 1.5nnt = 需要处理的数字 (100/(p1-p0))

library(tidyverse)

p1 <- seq(0,1, 0.0001)
p0 <- seq(0,1,0.0001)
or <- 1.5

df <- tibble(p1 = as.numeric(), p0 = as.numeric(), nnt = as.numeric())

for (i in p1) {
for (j in p0) {
  or_formula <- round((i/(1-i))/(j/(1-j)),3)
  
  if (or_formula == or & !is.na(or_formula)) {
    df <- df %>% add_row(p1 = i, p0 = j, nnt = round(1/(i-j), digits = 0))
  }
  
}
}

最佳答案

我们可以使用 outer

or_formula <- function(i, j) round((i/(1-i))/(j/(1-j)), 3)
m1 <- outer(p1, p0, FUN = or_formula)
dim(m1)
#[1] 10001 10001
i1 <- m1 == or & !is.na(m1)
i2 <- which(i1, arr.ind = TRUE)
p1new <- p1[i2[,1]]
p0new <- p0[i2[,2]]
df1 <- tibble(p1 = p1new, p0 = p0new, nnt = round(1/(p1new-p0new), digits = 0))

基准测试

-使用外部

system.time({
  m1 <- outer(p1, p0, FUN = or_formula)
  i1 <- m1 == or & !is.na(m1)
  i2 <- which(i1, arr.ind = TRUE)
  p1new <- p1[i2[,1]]
  p0new <- p0[i2[,2]]
  df1 <- tibble(p1 = p1new, p0 = p0new, nnt = round(1/(p1new-p0new), digits = 0))
 
 
 })
#   user  system elapsed 
#  5.038   1.288   6.319 

-使用 OP 的 for 循环

system.time({
  df <- tibble(p1 = as.numeric(), p0 = as.numeric(), nnt = as.numeric())
  
  for (i in p1) {
   for (j in p0) {
   or_formula <- round((i/(1-i))/(j/(1-j)),3)
   
   if (or_formula == or & !is.na(or_formula)) {
     df <- df %>% add_row(p1 = i, p0 = j, nnt = round(1/(i-j), digits = 0))
   }
   
 }
 }
 
 
 })
#   user  system elapsed 
#122.391   0.748 123.128 

-测试相等性

identical(df, df1)
#[1] TRUE

关于r - 如何在 R 中为这个嵌套的 for 循环编写更有效的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67679305/

相关文章:

R Hadoop header = 真

r - 涉及 Shiny map 生成的问题

r - 使用 R 进行数据转换

c++ - 关于循环和迭代器的 c++11 范围

python - numpy 遍历两个二维数组

GCC 矢量化指令

R Shiny - 如何创建根据时间单位(周、月、年)使用react并按时间单位聚合数据的条形图

java - 在嵌套循环中填充数组

c - c中for循环问题中的特殊字符读取

Java:获取满足条件的数组的子集