Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提高R(Rcpp)中4嵌套for循环的速度?_R_For Loop - Fatal编程技术网

提高R(Rcpp)中4嵌套for循环的速度?

提高R(Rcpp)中4嵌套for循环的速度?,r,for-loop,R,For Loop,假设我有一个包含1000个条目/行的数据帧。每行有一个ID,第二列有一些数据,第三列也有一些数据 因此,数据框看起来像: ID yesNo Id_specific_data 1 1 4 2 0 8 3 0 43 4 1 11 5 0 9 。。。等等 我现在需要做以下工作: n = 4 ID_range <- c(1:n) ID_spec_data <- floor(run

假设我有一个包含1000个条目/行的数据帧。每行有一个ID,第二列有一些数据,第三列也有一些数据

因此,数据框看起来像:

ID    yesNo   Id_specific_data
1     1       4
2     0       8
3     0       43
4     1       11
5     0       9
。。。等等

我现在需要做以下工作:

n = 4

ID_range <- c(1:n)
ID_spec_data <- floor(runif(n, min=10, max=100))
yesNo_data <- sample(c(0,1), replace=TRUE, size=n)

df <- data.frame("ID" = ID_range, "yesNo" = yesNo_data, "ID_specific_data" = ID_spec_data)

m <- 1
for (i in seq(1, 100, 1)) {
    for (j in seq(0.1, 1, 0.1)) {
        log_like_list <- c()
        for (k in seq(0.1, 1, 0.1)) {
            total_ID_list <- c()
            for (l in seq(1, length(df$ID))) {

                x = (df$ID_specific_data[[l]]*k - j) / (i*j)
                calc = pnorm(x, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
                total_ID_list[[l]] = calc
            }

            # log likelihood function
            final_calc = sum(df$yesNo*log(total_ID_list)+(1-df$yesNo)*log(1 - total_ID_list))
            log_like_list[[m]] = final_calc

            m <- m + 1
        }

    }
}
n=4

ID_range这不是一个100%的答案,你可以复制和粘贴,但我认为它会帮助你得到部分答案。主要需要考虑的是,为什么要花时间做循环,而实际上是在处理常量值

比如说

i <- seq(1, 100, 1)
j <- seq(0.1, 1, 0.1)
ioxj <- i %o% j
df_ij <- data.frame("i" = i, "j" = j, "ioxj" = ioxj)
df_ij$ixj <- df_ij$i * df_ij$j

i这不是一个100%的答案,您可以复制和粘贴,但我认为它将帮助您获得部分答案。主要需要考虑的是,为什么要花时间做循环,而实际上是在处理常量值

比如说

i <- seq(1, 100, 1)
j <- seq(0.1, 1, 0.1)
ioxj <- i %o% j
df_ij <- data.frame("i" = i, "j" = j, "ioxj" = ioxj)
df_ij$ixj <- df_ij$i * df_ij$j

i我认为您当前的编辑仍然是错误的,
您可能不应该在任何循环中重新定义
log\u like\u list
。 这里有一个替代方法,首先使用
expand.grid
分配所有参数组合, 这在RAM方面有点浪费, 但我认为这是可以管理的:

n <- 4L
df <- data.frame(
  ID = 1L:n,
  yesNo = sample(c(0,1), replace=TRUE, size=n),
  ID_specific_data = floor(runif(n, min=10, max=100))
)

params <- expand.grid(
  i = seq(1, 100, 1),
  j = seq(0.1, 1, 0.1),
  k = seq(0.1, 1, 0.1)
)

log_like <- sapply(1L:nrow(params), function(row_id) {
  i <- params$i[row_id]
  j <- params$j[row_id]
  k <- params$k[row_id]

  calc <- sapply(df$ID_specific_data, function(idsd) {
    x <- (idsd * k - j) / (i * j)
    pnorm(x, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
  })

  sum(df$yesNo * log(calc) + (1 - df$yesNo) * log(1 - calc))
})

n我认为您当前的编辑仍然是错误的,
您可能不应该在任何循环中重新定义
log\u like\u list
。 这里有一个替代方法,首先使用
expand.grid
分配所有参数组合, 这在RAM方面有点浪费, 但我认为这是可以管理的:

n <- 4L
df <- data.frame(
  ID = 1L:n,
  yesNo = sample(c(0,1), replace=TRUE, size=n),
  ID_specific_data = floor(runif(n, min=10, max=100))
)

params <- expand.grid(
  i = seq(1, 100, 1),
  j = seq(0.1, 1, 0.1),
  k = seq(0.1, 1, 0.1)
)

log_like <- sapply(1L:nrow(params), function(row_id) {
  i <- params$i[row_id]
  j <- params$j[row_id]
  k <- params$k[row_id]

  calc <- sapply(df$ID_specific_data, function(idsd) {
    x <- (idsd * k - j) / (i * j)
    pnorm(x, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
  })

  sum(df$yesNo * log(calc) + (1 - df$yesNo) * log(1 - calc))
})

n首先,这是不可复制的,因为循环终止缺少
{}
。第二,你遇到的主要问题是关于结果持有者的问题。事先,您知道输出对象的长度,方法是使用
c()
而不是
vector('list',3)
初始化。请阅读并更新您的帖子。若要进一步更新,您能否向我们提供预期的输出?进行一些快速计算将表明
i
j
k
循环一起运行,用于
类似日志的列表
的29820000个不同项目。这是你的意图吗?(基于
长度(seq(from,to))
的长度)我认为在循环中有些东西会给你带来问题日志列表请提供一些预期输出。您正在循环内重新定义
total\u ID\u list
。。是否要使用
total\u ID\u list[[m]]
而不是
total\u ID\u list[[l]]
?正如@coatless所建议的,您应该预先分配与
i
j
k
l
序列对应大小的向量(或更好的数组)。首先,这是不可复制的,因为循环终止缺少
{}
。第二,你遇到的主要问题是关于结果持有者的问题。事先,您知道输出对象的长度,方法是使用
c()
而不是
vector('list',3)
初始化。请阅读并更新您的帖子。若要进一步更新,您能否向我们提供预期的输出?进行一些快速计算将表明
i
j
k
循环一起运行,用于
类似日志的列表
的29820000个不同项目。这是你的意图吗?(基于
长度(seq(from,to))
的长度)我认为在循环中有些东西会给你带来问题日志列表请提供一些预期输出。您正在循环内重新定义
total\u ID\u list
。。是否要使用
total\u ID\u list[[m]]
而不是
total\u ID\u list[[l]]
?正如@coatless所建议的,你应该预先分配你的向量(最好是一个数组),它的大小与你的
i
j
k
l
序列相对应。