1

データフレーム内のすべての値を再計算するために、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)

データフレーム内のすべての値の平均を計算します。データフレームは、行列df1 <-as.matrix(df)overallmean <-mean(df1)に変換されます。

データの最初の目標は、colnamesによってサブセットを作成することです。Aのグループ、Bのグループ、Cのグループの3つのグループを生成します。サブセットは次のコードで定義されています。

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

3つのグループが作成されます。eggroup AIの各値について、次の合計を計算します:(値-overallmean-meanofthegroup)+overallmean。したがって、このバッチ効果関数を作成します。

"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)

結果はOKですが、結果をデータフレームとして返します。そして、私自身のデータでは、この関数は本当に遅いので、mabyには何かをsapplyするような高速化の方法があると思いました。

4

1 に答える 1

1

あなたの機能はかなり奇妙です。これは次のように簡略化できます。

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を取得するには、1行のコードが必要です。

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

これで、1つの関数内で完全な元のデータフレームを処理できます。

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"))

すべての列を含むデータフレームを返します。各列について、グループ平均が減算されます。前に述べたように、全体的な平均を追加してから削除することができますが、それはまったく違いはありません。

于 2011-04-05T09:10:39.140 に答える