相当简单的问题,但我的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
问题
UPDATE1
更改为FUN = function(x)....现在错误消失了。相反,我得到
dim(X) must have a positive length
然后昏暗(GeneMatrix)返回正值......
UPDATE2
经过更多调整后更新了代码
答案 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
首先在几列上试一试。有人可能会为你申请工作,但我对reshape
和plyr
答案 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
,但我不确定您是否需要这样做。