2

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

介绍

我正在使用包 Survdiff。使用一次就可以了,但我想通过许多变量循环它。

例如:我有一个包含 43000 个变量和 177 个观察值的数据框。data.frame 也有 3 个初始变量;第一个只是一个身份号码,第二个是“时间”,第三个是“cens”。Survdiff 软件包需要时间和 cens。但由此可知,我们要循环遍历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. 我不确定在这种情况下如何正确使用“应用”,因为该功能更复杂。

更新1

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

dim(X) must have a positive length

然而 dim(GeneMatrix) 返回正值...

更新2

更多调整后更新代码

4

2 回答 2

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

于 2013-02-23T12:23:45.980 回答
1

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

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

另一个问题是您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 回答