Пересчитать каждую точку в кадре данных с помощью lapply / sapply - PullRequest
1 голос
/ 05 апреля 2011

Я пишу свою собственную функцию с именем batcheffect, чтобы пересчитать все значения в кадре данных.Функция нуждается только в кадре данных в качестве импорта.Сначала вычисляется среднее значение в функции, а затем для каждой точки в кадре данных выполняется вычисление и создается новый кадр данных.

batcheffect <- function (experiment){    
   corr<-list()    
   matrixexp<-as.matrix(experiment)    
   expmean <-mean(matrixexp)

   for (i in 1:length(matrixexp)){    
      correction <- (matrixexp[i]-overallmean - expmean)+overallmean    
      corr[[i]]<- matrix(correction)
   }
   return(unlist(corr)) 
}

Для большого кадра данных цикл внутри функции выполняется медленно.Поэтому я хочу использовать функцию sapply или lapply для ускорения процесса.У кого-нибудь есть предложения?

Спасибо

ОБНОВЛЕНИЕ: Например, у меня есть такой фрейм данных, как этот df <- data.frame (A = 1: 10, B = 10: 1, C = 11: 20, C1 = 21: 30, B1 = 31: 40, A2 = 41: 50) </p>

Для расчета среднего значения для всех значений в кадре данных.Кадр данных преобразуется в матрицу df1 <-as.matrix (df) totalmean <-mean (df1) </p>

Первая цель данных - создать подмножества по именам столбцов.Вы генерируете три группы, группу с А, группу с В и группу с С.подмножества определяются следующим кодом:

"selectexperiments" <- function (partialname, data) 
{
result <- data[,grep(partialname, colnames(data))]
return(result)
}
A<-selectexperiments('A', df)
B<-selectexperiments('B', df)
C<-selectexperiments('C', df)

Три группы созданы.Для каждого значения в AI группы яиц нужно вычислить следующую сумму: (значение - totalmean -meanofthegroup) + totalmean.поэтому я создаю эту функцию батч-эффекта.

"batcheffect" <- function (group)
{
corr<-list()
matrixexp<-as.matrix(group)
expmean <-mean(matrixexp) #mean of the group
for (i in 1:length(matrixexp)){ 
correction <- (matrixexp[i]-overallmean - expmean)+overallmean
corr[[i]]<- matrix(correction)
}
return(unlist(corr))
}

Abatch<-batcheffect(A)

Результат в порядке, но я верну результат в виде кадра данных.И, по моим собственным данным, эта функция очень медленная, поэтому я подумал, что у Мэйби есть такой способ ускорения, как spply чего-то.

1 Ответ

1 голос
/ 05 апреля 2011

Ваша функция довольно странная.Это может быть упрощено до:

batcheffect <- function (experiment){
    matrixexp<-as.matrix(experiment)
    expmean <-mean(matrixexp)
    c(matrixexp - expmean)
}

и даст точно такой же результат.Простое исчисление показывает, что

(matrixexp[i]-overallmean - expmean)+overallmean

совершенно равно

matrixexp[i]- expmean

И поскольку R-вычисления векторизованы, цикл не требуется.Возвращает вектор (следовательно, функция c()).

Используя unlist(), вы можете еще больше упростить до:

batcheffect2 <- function(experiment){
  x <- unlist(experiment,use.names=F)
  x - mean(x)
}

, что снова возвращает точно такой же результат.Вы уверены, что это то, что вы имели в виду?


РЕДАКТИРОВАТЬ:

Учитывая ваши комментарии, я добавляю сюда тестовый код.Я назвал вашу оригинальную функцию old.batcheffect().Как видите, на примере кадра данных (и после инициализации тайны overallmean) результат всех функций одинаков:

> Df <- data.frame(A1=1:10,B1=10:1,C1=11:20)
> overallmean <- runif(1)
> X1 <- old.batcheffect(Df)
> X2 <- batcheffect(Df)
> X3 <- batcheffect2(Df)

> all.equal(X1,X2)
[1] TRUE
> all.equal(X2,X3)
[1] TRUE

EDIT2:

Для получения батч-эффектавозвращая фрейм данных, такой как оригинал, вам нужна только одна строка кода:

batcheffect <- function(x) x - mean(unlist(x))

Теперь вы можете обработать весь оригинальный фрейм данных в одной функции:

summaryBatch <- function(data,groups){
    tmp <- lapply(groups,function(x){
        data[,grep(x,names(data))]
    })
    out <- lapply(tmp,function(x){
        x - mean(unlist(x))

    })
    do.call(cbind,out)
}

Тогда:

summaryBatch(df,c("A","B","C"))

возвращает фрейм данных со всеми столбцами, где для каждого столбца вычитается среднее значение группы.Как было сказано ранее, вы можете добавлять и впоследствии удалять общее значение, но это не имеет значения.

...