2015-11-05 29 views
0

工作,我有一個數據幀脅:之一「否則,如果」命令並不在for循環

Tar_RL Tar_UD Resp RT  Button_Rel Accur    
LEFT UP  201 12582 1439  miss 
RIGHT DOWN 203 12389 1440  miss 
RIGHT UP  204 10748 1280  miss 
RIGHT DOWN 203 11056 1760  miss 
RIGHT DOWN 203 6090 1680  miss 
LEFT DOWN 202 5743 1440  hit 
LEFT DOWN 202 5671 1520  hit 
LEFT UP  201 5378 1520  hit 
RIGHT UP  204 5032 1360  hit 
RIGHT DOWN 203 5038 1440  hit 
RIGHT UP  204 4399 1360  hit 
RIGHT DOWN 203 4273 1849  hit 
RIGHT DOWN 203 5087 1683  hit 
RIGHT UP  204 4453 1760  hit 

Tar_RL和TAR_UD的組合如下:左+上被編碼爲201,LD - 202,RD - 203,RU - 204

我寫了一個代碼爲Tar_RL和Tar_UD組合在新列Corr_Resp映射:

FLANK$Corr_Resp <- 0 

for (i in 1:nrow(FLANK)) { 
if(FLANK$Tar_RL[i]<= 'LEFT' & FLANK$Tar_UD[i]<= 'UP'){ 
    FLANK$Corr_Resp[i] <- 201 
} 
else if (FLANK$Tar_RL[i]<= 'LEFT' & FLANK$Tar_UD[i]<= 'DOWN'){ 
    FLANK$Corr_Resp[i] <- 202 
} 
else if(FLANK$Tar_RL[i]<= 'RIGHT' & FLANK$Tar_UD[i]<= 'DOWN'){ 
    FLANK$Corr_Resp[i] <- 203 
} 
    else if (FLANK$Tar_RL[i]<= 'RIGHT' & FLANK$Tar_UD[i]<= 'UP'){ 
    FLANK$Corr_Resp[i] <- 204 
} 
} 

但是,它給了我這種輸出的地方的價值觀202(LD的組合)缺失:

Tar_RL Tar_UD Resp RT  Button_Rel Accur Corr_Resp 
LEFT UP  201 12582 1439  miss 201 
RIGHT DOWN 203 12389 1440  miss 203 
RIGHT UP  204 10748 1280  miss 204 
RIGHT DOWN 203 11056 1760  miss 203 
RIGHT DOWN 203 6090 1680  miss 203 
LEFT DOWN 202 5743 1440  hit 201 
LEFT DOWN 202 5671 1520  hit 201 
LEFT UP  201 5378 1520  hit 201 
RIGHT UP  204 5032 1360  hit 204 
RIGHT DOWN 203 5038 1440  hit 203 
RIGHT UP  204 4399 1360  hit 204 
RIGHT DOWN 203 4273 1849  hit 203 
RIGHT DOWN 203 5087 1683  hit 203 
RIGHT UP  204 4453 1760  hit 204 

什麼是錯我的代碼?

+0

爲什麼你試着'<='(小於或等於)與字符?可能你需要'=='? – Batanichek

+0

謝謝,解決了這個問題! – MariKo

+0

你可以不用'FLANK $ Corr_Resp [FLANK $ Tar_RL =='LEFT'&FLANK $ Tar_UD =='UP'] = 201'和其他組合 – Batanichek

回答

2

有錯字錯誤更換<===

,但更好的您正在使用的字符串<=關係運算符做沒有loop

FLANK$Corr_Resp[FLANK$Tar_RL== 'LEFT' & FLANK$Tar_UD== 'UP']=201 
FLANK$Corr_Resp[FLANK$Tar_RL== 'LEFT' & FLANK$Tar_UD== 'DOWN']=202 
FLANK$Corr_Resp[FLANK$Tar_RL== 'RIGHT' & FLANK$Tar_UD== 'DOWN']=203 
FLANK$Corr_Resp[FLANK$Tar_RL== 'RIGHT' & FLANK$Tar_UD== 'UP']=204 
3

。字符串按關係運算符的字典順序進行比較。因此,"DOWN" <= "UP"將返回TRUE。現在

,在你的代碼,

第一if分支運行時Tar_RL[i] is "LEFT" and Tar_UD[i] is either "UP" or "DOWN"

第二個if分支運行時Tar_RL[i] is "LEFT" and Tar_UD[i] is "DOWN"

這個條件已經在第一個模塊中滿足了。所以第二塊永遠不會運行。並且您不會在Corr_Resp列中獲得202

要麼改變這兩個if塊的順序,即,

if(FLANK$Tar_RL[i]<= 'LEFT' & FLANK$Tar_UD[i]<= 'DOWN'){ 
    FLANK$Corr_Resp[i] <- 201 
} 
else if (FLANK$Tar_RL[i]<= 'LEFT' & FLANK$Tar_UD[i]<= 'UP'){ 
    FLANK$Corr_Resp[i] <- 202 
} 

或更好得多和易於理解的解決方案是使用==操作者檢查是否兩個字符串相同。

1
as.numeric(factor(with(FLANK, paste0(Tar_RL, Tar_UD)), 
levels=c("LEFTUP", "LEFTDOWN", "RIGHTDOWN", "RIGHTUP")))+200