Оптимизируйте эту процедуру цикла for, чтобы избежать сбоя программы - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь выполнить операцию в 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))

И я хочу выполнить эту операцию:

for (row in 1:nrow(X)){
  X$A <- (X$A / (X[row, "Stop"] - X[row, "Start"])) * mean(X$Stop - X$Start)
  X$B <- (X$B / (X[row, "Stop"] - X[row, "Start"])) * mean(X$Stop - X$Start)
  X$C <- (X$C / (X[row, "Stop"] - X[row, "Start"])) * mean(X$Stop - X$Start)
}

Моя проблема возникает, когда мой документ намного больше (например, 2.000.000 строк). Есть ли способ сделать эту операцию быстрее в таком большом data.frame?

1 Ответ

1 голос
/ 05 ноября 2019

Ваш цикл медленный, потому что вы перезаписываете все векторы A, B и C каждый раз, когда проходите одну строку. то есть вы пишете более 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)) )

Я настоятельно рекомендую не перезаписывать текущие значения 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)) )
...