2013-03-26 59 views
0

與矩陣這樣布爾運算符中,如果/ ifelse循環

r<-20; 
c<-6; 
m1 <- round(matrix(runif(r*c), r, c))) 

我想創造被利用,即如果/ ifelse和布爾運算符基於過去三年兩個新列。

我嘗試以下,但沒有成功:

for (i in 1:dim(m1)[1]){ 
    if(sum(m1[i,4:6]==0)) {m1$Code1[i]<-0;m1$Code2[i]<-0} 
    else if(sum(m1[i,4:6]==3)) {m1$Code1[i]<-5;m1$Code2[i]<-5} 
    else if(m1[i,4]==0 && m1[,5]==1) {m1$Code1[i]<-3} 
    else if(m1[i,4]==0 && m1[,6]==1) {m1$Code2[i]<-3} 
    else if(m1[i,4]==1 && m1[,5]==0) {m1$Code1[i]<-2} 
    else if(m1[i,4]==1 && m1[,6]==0) {m1$Code2[i]<-2} 
    else if(m1[i,4]==1 && m1[,5]==1) {m1$Code1[i]<-4} 
    else if(m1[i,4]==1 && m1[,6]==1) {m1$Code2[i]<-4} 
} 

我的問題是,如果我可以,如果子句中使用中的& &,但不知何故,這是行不通的。有人能給我一個提示爲什麼或有更好的選擇來?

由於提前, 斯蒂芬

+3

標記語言。 – 2013-03-26 22:21:40

+1

請將相關的語言標籤添加到您的問題。 – 2013-03-26 22:21:58

+0

我的猜測是'm1 [,5]'部分,但需要一種語言才能更好地理解問題。 – 2013-03-26 22:24:40

回答

0

我從你的for循環提煉出要在4號線和5號線的組合和4號線和6的組合執行相同的操作我想你那麼最好可以創建一個通用函數並將其應用於這兩種組合。我爲您的問題提出以下解決方案。

get.code <- function(x) { 
if(x[1] == 0 & x[2] == 0){0} else if (x[1] == 0 & x[2] == 1){3 
}else if(x[1] == 1 & x[2] == 1){4} else {2} 
} 

code1 <- apply(m1[,c(4,5)], 1, get.code) 
code2 <- apply(m1[,c(4,6)], 1, get.code) 
cbind(m1,code1, code2) 
+0

嗨Edwin,謝謝你的提議。 此代碼考慮到&運營商,工作順利。但是,對於三列進行比較的'for'循環的第二行中的評估是不考慮的。 這是否必須額外完成? – 2013-04-08 15:20:49

+0

我終於選擇寫入其他功能來評估其餘選項。 – 2013-04-16 16:29:01