2011-03-23 2 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, 1

누구든지 도와 줄 수 있습니까? 감사! 루프 코드를

: 나는 당신의 코드에서 읽을 수로

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

이이 이전 질문에 관련이 루프 코드, 다음 사람이 –

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

그것은 모든 가능한 결과, 같은 regulationpattern을 가지고있는 유전자, 당신과 함께 목록 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="-") 
+0

whoh! Joris Meys에게 많은 감사를드립니다. 이것은 내가 필요한 것입니다. – Lisann