首页 文章

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

提问于
浏览
1

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

矩阵:

条件[,1]
ILMN_1666845 TRUE ILMN_1716400是的

Data.frame

a t1 t2 t3 t4 1 0 1 1 1

如果我使用cbind()没有循环,一切都很好,这是结果:

b <-cbind(条件,a)b条件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(regulationtable,1,function(i)sum(i [1:length(regulationtable)]!= outcome [p,])== 0)idd <-as.matrix(id)condition = subset(idd,idd [,1] == TRUE)a <-as.data.frame(t(outcome [p,]))b <-cbind(condition,a) write.table(b,“file.txt”,append = TRUE)}

1 回答

  • 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="-")
    

相关问题