2015-11-05 31 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