循环Survdiff

时间:2013-02-23 09:54:07

标签: r

相当简单的问题,但我的R知识不是很好。

简介

我正在使用Survdiff包。使用它一次很好,但我想通过许多变量循环它。

例如:我有一个43,000个变量的data.frame,有177个观察值。 data.frame还有3个初始变量;第一个只是一个身份号码,第二个是'时间',第三个是'人口'。 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', 因为功能更复杂。
  2. UPDATE1

    更改为FUN = function(x)....现在错误消失了。相反,我得到

    dim(X) must have a positive length
    

    然后昏暗(GeneMatrix)返回正值......

    UPDATE2

    经过更多调整后更新了代码

2 个答案:

答案 0 :(得分:2)

好的,这就是我要做的。我假设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

首先在几列上试一试。有人可能会为你申请工作,但我对reshapeplyr

非常了解

答案 1 :(得分:1)

您应该阅读apply的帮助页面。在这种情况下,您没有正确使用它。

它在数组的边距上应用了一个函数,并且您没有提供数组或参数来声明边距(行/列)以应用该函数。而是使用列表和lapply

另一个问题是你在apply中编写function(x),但尝试使用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的论点从time更改为GeneMatrix$time,但我不确定您是否需要这样做。