2011-03-22 74 views
1

我创建了一个类似下面的循环来检查与表中的行匹配的条件。如果它们匹配,则打印出rowname。如果它们不匹配,则不会发生任何事情。将表的多行匹配到多个条件

condition <- c(0,0,1,1) 
id <- apply(table, 1, 
      function(i) sum(i[1:length(table)] != condition)==0) 
idd<-as.matrix(id) 
for (i in 1:length(idd)){      
    if (idd[i] == TRUE) { 
     print(rownames(idd)[i]) 
    }    
} 

> table         
>   [1] [2] [3] [4]      
>1651838 1 1 0 0 
>1653006 0 0 0 0 
>1656415 0 0 0 1 
>1657317 -1 0 0 0 

我的问题是:是否有可能使这个循环的多个条件?例如:

condition <- c("0,0,0,0","0,0,0,1","0,0,1,0","0,1,0,0","1,0,0,0", 
       "0,0,1,1","1,1,0,0","0,1,1,0","1,0,0,1","1,0,1,0", 
       "0,1,0,1","1,0,1,1","1,1,0,1","1,1,1,0","0,1,1,1","1,1,1,1") 

for(r in 1:length(condition)){ 
    id <- apply(regulationtable, 1, 
       function(i) sum(i[1:length(regulationtable)] != condition[r])==0 
       ) 
    idd<-as.matrix(id) 
    test<-list() 
    for (i in 1:length(idd)) {      
     if (idd[i] == TRUE) { 
      print(rownames(idd)[i]) 
     }    
     test[[i]]<-matrix(idtest) 
    } 
} 

谢谢!

+1

看起来非常相似的措词http://stackoverflow.com/questions/5375642/venndiagram-create-list-of-venncounts – 2011-03-22 10:26:37

回答

1

如何:

## make up data 
z <- matrix(c(1,0,0,-1,1, 
       1,0,0,0,1, 
       0,0,0,0,0, 
       0,0,1,0,0), 
      nrow=5, 
      dimnames=list(LETTERS[1:5],NULL)) 

condition <- c("0,0,0,0","0,0,0,1","0,0,1,0","0,1,0,0","1,0,0,0", 
       "0,0,1,1","1,1,0,0","0,1,1,0","1,0,0,1","1,0,1,0", 
       "0,1,0,1","1,0,1,1","1,1,0,1","1,1,1,0","0,1,1,1","1,1,1,1") 

strtab <- apply(z,1,paste,collapse=",") 
## rownames(z)[match(condition,strtab)] ## first match only 
omat <- outer(condition,strtab,"==") ## all comparisons 
colnames(omat)[col(omat)][omat]  ## select corresponding colnames 

+0

这是一个真正的解决方案,但如果Z有两个相同的行,只显示第一行。 – Lisann 2011-03-22 15:11:30

+0

会为您修改版本吗? (PS:我不知道你是否可以改变你的问题的标题,但它看起来不是很具描述性:我会说“像表中的多行匹配多个条件” - 正确的答案需要不涉及循环,实际上可能不会... – 2011-03-22 19:19:30

2

在二元%函数%应该返回匹配的所有行:

> rownames(table)[strtab %in% condition] 
[1] "1651838" "1653006" "1656415" 

> tabl2 <- table[c(1:4, 3), ] 
> rownames(tabl2)[strtab %in% condition] 
[1] "1651838" "1653006" "1656415" "1656415" 

(我有点惊讶地听到,比赛不会那么做,因为在%%的在用写比赛它的核心。)

+0

你是对的,这是我需要的,谢谢! – Lisann 2011-03-23 11:10:37

+0

比我的好... – 2011-03-23 13:21:31