Быстрее на l oop дюйм R - PullRequest
       21

Быстрее на l oop дюйм R

0 голосов
/ 01 августа 2020

Я хочу извлечь из матрицы только строки, соответствующие определенному индексу. Есть ли способ ускорить для l oop?

for(x in 1:dim(gene)[1]){
   for(y in 1:dim(geno)[1]){
      if(grepl(gene[x,2], geno[y], fixed = TRUE)){
         geno_gene <- rbind(geno_gene, geno[y,2:dim(geno)[2]])
         next
      }
   }
}

1 Ответ

0 голосов
/ 03 августа 2020

Поделитесь немного наборами данных gene и geno. В чем проблема? Это медленно? По сравнению с чем?

По крайней мере, ваш l oop подчиняется поведению R копирование при изменении. Используя функцию address из pryr, мы видим, что после вызова rbind ваш объект m теперь является копией своего прежнего «я»:

library(pryr)

m <- matrix(1:6, nrow = 3, ncol = 2)
address(m)
new_row <- c(8, 9)
m <- rbind(m, new_row)
address(m)

Матрица m меняет адрес после rbind:

> m <- matrix(1:6, nrow = 3, ncol = 2)
> address(m)
[1] "0x18a0d4737f0"
> new_row <- c(8, 9)
> m <- rbind(m, new_row)
> address(m)
[1] "0x18a0fcb7450"

Это означает, что R создал копию m, привязал к ней новую строку, присвоил копии имя m и оставил ее сборщику мусора для удаления. оригинальной версии m. И он делает это для каждой итерации вашего l oop. Это хорошо известный механизм, почему петли R могут быть медленными. Прочтите от Hadley Wickham здесь для получения дополнительной информации.

Один из возможных выходов - оценить, можно ли заменить функцию, которую использует ваш l oop, векторизованной функцией в R (а их много векторизованные функции).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...