2

かなり単純な質問ですが、私のRの知識はあまり良くありません。

序章

私はパッケージSurvdiffを使用しています。一度使用するのは問題ありませんが、多くの変数をループさせたいと思います。

例:177個の観測値を持つ43000個の変数のdata.frameがあります。data.frameにも3つの初期変数があります。1つ目は単なるID番号、2つ目は「時間」、3つ目は「cens」です。Survdiffパッケージには、時間と費用の両方が必要です。しかし、これから、data.frame内の残りの変数、つまりGenedata [、4:43000]をループする必要があることがわかります。

これまでに行ったことは、通常はforステートメントを使用しますが、Rでは、これがapplyステートメントよりもはるかに遅い可能性があることを認識しています。

cols <- as.list( names(Genedata) ) #generate a list of column numbers
Geneset <- lapply(cols , function (x) { survdiff( Surv( Genedata$time, Genedata$cens=="1" ) ~ x , data = Genedata )$chisq } )

ただし、エラーが発生します

"Error in model.frame.default(formula = Surv(Genedata$time, Genedata$cens ==  : 
  variable lengths differ (found for 'x')"

データのサンプル(最初の15行8列)-注:ヘッダーがオーバーフローしました

Accession   time    cens    A1BG.229819_at  A1BG_AS1.232462_s_at    A1CF.220951_s_at    A1CF.241547_at  A2LD1.232422_at
1   120 0   0   0   0   0   1
2   120 0   0   0   0   0   1
3   28.96   NA  1   0   0   0   1
4   119.21  0   0   0   0   0   1
5   59.53   0   0   1   0   0   1
6   68.81   1   0   0   0   0   1
7   82.29   0   0   0   0   0   1
8   110.82  0   0   0   0   0   1
9   65.88   NA  1   0   0   0   1
10  84.13   0   0   0   0   0   1
11  16.47   NA  0   0   0   0   1
12  89.75   0   0   0   1   1   1
13  76.07   0   0   0   0   0   1
14  67.82   0   0   0   0   0   1

問題

  1. 関数がより複雑なため、この状況で「apply」を適切に使用する方法がわかりません。

Update1

FUN = function(x)....に変更されました。エラーはなくなりました。代わりに私は得る

dim(X) must have a positive length

それでも、dim(GeneMatrix)は正の値を返します。

Update2

さらに微調整した後、コードを更新しました

4

2 に答える 2

2

OK、これが私がすることです。私はデータフレームだGeneDataと思います。これがあなたのデータで実用的であるかどうかはわかりません(そのサイズを考えると)。

#Make some example data
df <- data.frame(id=1:100, time=rep(c(0,1),each=50), cens=sample(0:1,100,replace=T,prob=c(0.9,0.1)), X1=sample(0:1,100,replace=T),X2=sample(0:1,100,replace=T),X3=sample(0:1,100,replace=T))

#Melt data into long form (yours will be very long)
library(reshape2)
df.m <- melt(df, id.vars=names(df)[1:3],variable.name="gene")

#Use ddply (from plyr) to operate on each gene's data (I'm guessing they're genes)
library(plyr)    
GeneSet <- ddply(df.m, .(gene), function(x){
  a <- survdiff(Surv(time, cens=='1') ~ value,x)
  a$chisq
})
#> GeneSet
#  gene        V1
#1   X1 0.5041291
#2   X2 0.1222732
#3   X3 2.3488909

最初にいくつかの列で試してみてください。誰かがあなたのために応募を働かせることができるかもしれませんが、私は本当に知識がreshapeあり、plyr

于 2013-02-23T12:23:45.980 に答える
1

applyのヘルプページを読む必要があります。この場合、正しく使用していません。

配列のマージンに関数を適用しますが、関数を適用するマージン (行/列) を示す配列または引数を指定していません。代わりに list とlapplyを使用してください。

もう 1 つの問題はfunction(x)、apply に書き込んで、でループしようとすることGeneMatrix[,i]です。代わりに GeneMatrix[,x] が機能するはずです。

だから試してみてください

cols <- as.list( names(Genedata) )[-c(1:4)] #generate a list of column numbers
Geneset <- lapply( cols , function (x) { survdiff( Surv( time, cens=="1" ) ~ get(x) , data = Genedata )$chisq } )

それが役立つことを願っています。そうでない場合はお知らせください。Surv の引数を から に変更しましたtimeGeneMatrix$time、それを行う必要があるかどうかはわかりません。

于 2013-02-23T13:21:49.987 に答える