2011-03-23 70 views
1

我有一個簡單的問題,但它花費我幾個小時。我想cbind()一個矩陣和一個數據框。問題是,他們沒有相同的長度。將循環中的不等長矩陣與cbind組合()

矩陣:

condition

 [,1] 

ILMN_1666845 TRUE

ILMN_1716400 TRUE

Data.frame

a

t1 t2 t3 t4 1 0 1 1 1

如果我用cbind()返回沒有環,一切正常,這就是結果:

b<-cbind(condition,a) b

 condition t1 t2 t3 t4 

ILMN_1666845 TRUE 0 1 1 1

ILMN_1716400 TRUE 0 1 1 1

但在for循環中,我收到以下錯誤: data.frame中的錯誤(...,check.names = FALSE): 參數意味着行數不同:0,謝謝!

對於循環代碼:

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

id <- apply(regulationtable, 1, function(i)

sum(i[1:length(regulationtable)] != outcomes[p,])==0)

idd<-as.matrix(id)

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

a<-as.data.frame(t(outcomes[p,]))

b<-cbind(condition,a)

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

+1

向我們顯示您的循環代碼,然後有人可以幫助 – 2011-03-23 15:04:08

+1

這與您以前的問題有關。你能描述一下你正在嘗試的是什麼以及結構和監管結構是什麼?如果可能的話,爲我們提供一個重現錯誤的最簡單的例子。 – 2011-03-23 15:33:06

+0

我創建了一個重新創建您所描述的錯誤的最小示例。我還增加了一個更好的方法來避免你在這個和你以前的問題中遇到的麻煩。如果你需要更多的解釋,請問。 – 2011-03-23 21:32:10

回答

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,對於每一個可能的結果,具有相同regulationpattern的基因。這是測試與:

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="-") 
+0

whoh!非常感謝Joris Meys。這正是我需要的。 – Lisann 2011-03-24 07:34:51