优化此for循环过程以避免程序崩溃

优化此for循环过程以避免程序崩溃,r,for-loop,optimization,R,For Loop,Optimization,我正在努力尝试在R中执行一个操作而不使其崩溃。我给你举一个可复制的例子。我有X: X <- data.frame(V1 = c("chr1", "chr1", "chr1", "chr1", "chr1"), Start = c(0, 1001, 3002, 4059, 6581), Stop = c(1000, 3001, 4058, 6580, 7002), A = c(10, 4, 5,

我正在努力尝试在R中执行一个操作而不使其崩溃。我给你举一个可复制的例子。我有X:

X <- data.frame(V1 = c("chr1", "chr1", "chr1", "chr1", "chr1"),
                Start = c(0, 1001, 3002, 4059, 6581),
                Stop = c(1000, 3001, 4058, 6580, 7002),
                A = c(10, 4, 5, 6, 9),
                B = c(923, 39, 5, 9, 93),
                C = c(239, 2, 13, 4, 5))

X循环速度很慢,因为每次执行一行时都会覆盖整个A、B和C向量。i、 e.您正在为每行写入超过6.000.000个值(2.000.000次)

我在这里使用dplyr:

library(dplyr)

X <- X %>%
 mutate(A = (A/Stop - Start*(Stop-Start)),
        B = (B/Stop - Start*(Stop-Start)),
        C = (C/Stop - Start*(Stop-Start)) )
库(dplyr)
X%
变异(A=(A/停止-开始*(停止-开始)),
B=(B/停止-启动*(停止-启动)),
C=(C/停止-启动*(停止-启动)))
我强烈建议不要覆盖当前的ABC值

library(dplyr)

X <- X %>%
 mutate(TRANSFORMED_A = (A/Stop - Start*(Stop-Start)),
        TRANSFORMED_B = (B/Stop - Start*(Stop-Start)),
        TRANSFORMED_C = (C/Stop - Start*(Stop-Start)) )
库(dplyr)
X%
突变(转换的_A=(A/Stop-Start*(Stop-Start)),
转换的_B=(B/停止-开始*(停止-开始)),
转换的_C=(C/Stop-Start*(Stop-Start)))

< /代码> 如果您不打算在每次迭代中用更新的值覆盖整个列,那么您也可能需要考虑这些解决方案。data.table可以很好地处理大型数据集

library(data.table)      # loads library
setDT(X)                 # converts data.frame to data.table
cols = c("A", "B", "C")  # defines the columns to update
avg.diff = X[, mean(Stop - Start)]   # caclulates average difference between Stop and Start
X[, (cols) := lapply(.SD, function(x) {avg.diff * x / (Stop - Start)}), .SDcols = cols]  # makes calculations
或者相同,但更容易理解:

X[, `:=`(
  A = avg.diff * A / (Stop - Start),
  B = avg.diff * B / (Stop - Start),
  C = avg.diff * C / (Stop - Start)
)]

请根据您的需要随意调整这些解决方案。

尝试并行执行,并解释为什么您的电脑会崩溃?内存不足?所有代码都可以矢量化。1)
mean(X$Stop-X$Start)
不依赖于循环变量,只计算一次。2)
X$A或2b)
X$A@abrod不清楚代码应该做什么,但直觉上我认为Rui的结果实际上是正确的,而你的结果是错误的,因为你不断用更新的值覆盖整个列,这不太可能有意义,除非你想计算累积统计。这是正确的方法,但我不确定你的方程在数学上是否等同于OP。要得到他的原始结果,他需要用“nrow(X)”替换“1:nrow(X)”
X[, `:=`(
  A = avg.diff * A / (Stop - Start),
  B = avg.diff * B / (Stop - Start),
  C = avg.diff * C / (Stop - Start)
)]