Использование функций apply в R для неявного объекта - PullRequest
1 голос
/ 15 апреля 2020

Я обрабатываю специальный объект - объект SliceData из Matrix_eQTL - в al oop, и мне интересно, может ли он быть переписан любой функцией в «apply».

Позвольте мне объясните это на игрушечном примере. Сначала я создаю данные игрушек с помощью следующих сценариев.

library(MatrixEQTL)
set.seed(5)
gene_mat = matrix(data = rnorm(200000, mean=50, sd=10), nrow = 2000, ncol = 100)
gene = SlicedData$new(gene_mat);
gene$ResliceCombined(200)

Здесь у меня есть пользовательская функция invnorm.

invnorm <- function(expression){
  return(qnorm((rank(expression, na.last="keep") - 0.5)/sum(!is.na(expression))))
}

И я хочу применить это invnorm в каждой строке каждого среза gene объекта, который может быть реализован с помощью следующих сценариев

for( sl in 1:length(gene) ){
    mat = gene[[sl]]
    mat = t(apply(mat, 1, invnorm))
    gene[[sl]] = mat
}

Так есть ли способ переписать это l oop любой функцией в apply функция семьи? Заранее спасибо.

1 Ответ

2 голосов
/ 25 апреля 2020

Обычно мы могли бы подойти к этому, используя lapply, чтобы заменить ваш на l oop.

gene = lapply(gene, function(sl) t(apply(sl, 1, invnorm)))

Однако этот пакет использует классы S4, что означает, что обычный lapply не работает. Хорошей новостью является то, что вы для l oop должны быть такими же быстрыми, как и lapply. Плюс, нет ничего постыдного в использовании для l oop - операторы apply в основном просто синтаксис c sugar для удобства чтения.

См. Также:

Является ли семейство R больше, чем syntacti c сахар?

...