提高R(Rcpp)中4嵌套for循环的速度?
假设我有一个包含1000个条目/行的数据帧。每行有一个ID,第二列有一些数据,第三列也有一些数据 因此,数据框看起来像:提高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
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
序列相对应。