用cbind()组合循环中的不等长度矩阵

时间:2011-03-23 14:46:23

标签: r loops

我有一个简单的问题,但它花了我几个小时。我想cbind()一个矩阵和一个数据帧。关键是,它们没有相同的长度。

矩阵

  

条件

        [,1]
     

ILMN_1666845 TRUE

     

ILMN_1716400是的

Data.frame

  

     

t1 t2 t3 t4   1 0 1 1 1

如果我使用没有循环的cbind(),一切正常,结果就是这样:

  

b将-cbind(条件,一个)   B'/ P>

        condition t1  t2  t3  t4
     

ILMN_1666845是0 1 1 1

     

ILMN_1716400是0 1 1 1

但在for循环中我收到以下错误: data.frame(...,check.names = FALSE)出错:   参数意味着不同的行数:0,1

任何人都可以帮助我吗?谢谢!

对于循环代码:

  

for(p in 1:nrow(outcome)){

     

id< - apply(可规则,1,函数(i)

     

总和(我[1:长度(规定)]!=结果[p,])== 0)

     

IDD及LT; -as.matrix(ID)

     

condition = subset(idd,idd [,1] == TRUE)

     

A< -as.data.frame(吨(成果[P,]))

     

b将-cbind(条件,一个)

     

write.table(b,“file.txt”,append = TRUE)}

1 个答案:

答案 0 :(得分:2)

就我可以从您的代码中读取而言,您尝试cbind一个可能无效的空对象。这也是错误告诉你的。可能在某些时候a只是空的,因为没有匹配。所以只需添加一个条件

if(sum(id) !=0) { ... }

通过重写代码来考虑这一点,您可以从中受益匪浅。我试着猜猜你想做什么,这段代码完全一样:

xx <- apply(outcomes,1,function(p){
    id <- apply(regulationtable,1,function(i)
      sum(i != p ) == 0)
    if(sum(id) !=0)
     cbind(as.data.frame(id[id]),t(p))
})

write.table(do.call(rbind,xx),file="file")

它返回一个列表xx,对于每个可能的结果,具有相同规则模式的基因。用以下方法测试:

outcomes <- expand.grid(c(0,1),c(0,1),c(0,1),c(0,1))

regulationtable <- data.frame(
    t1=sample(0:1,10,replace=T),
    t2=sample(0:1,10,replace=T),
    t3=sample(0:1,10,replace=T),
    t4=sample(0:1,10,replace=T)
)
rownames(regulationtable) <- paste("Gene",1:10,sep="-")