所以我一直在试图弄清楚我的if条件有什么问题,但我无处可去。我对R还是个新手,所以也许我在这里不理解一些非常基本的概念?我的if -condition有什么问题?
我有一个数据帧(DC),我附加了一个逻辑“FALSE”列。现在我想根据我使用regexpr()指定的dc(dc $ Probe和dc $ Resp)两列中的值将每个FALSE更改为TRUE。
到目前为止它所做的是,对于两个if条件,它都将每个FALSE更改为TRUE,而不考虑dc第5列中的值。当我单独运行if条件时,我可以看到它们似乎在条件的或部分上工作正常,这意味着当dc $ Probe中的字符串匹配OR中指定的字符串之一时,代码只会生成TRUE -部分。但是,AND部分似乎被忽略了?因此,当我运行完整的代码时,我得到的列只有TRUE,这不是我想要的。
编辑:只有当Probe中的字符串以特定模式结束(如果两个条件中的任意一个指定)并且Resp中的相应值为模式的“100”时,我才会得到TRUE在我的第一个条件中指定,或者在我的第二个条件中指定的模式为“200”。因此,对于以(sg | s | w1 | w3 | s1 | s2)结尾的字符串,Resp必须为“100”以获得TRUE,对于以(\ d \ dg | \ d \ d)结尾的字符串,Resp必须为“200”以获得TRUE。所有其他情况应该是FALSE。例如,如果一个字符串在s1中结束,并且Resp中的对应值为200,则代码应该返回FALSE。
编辑:一些示例数据:
>dc<-data.frame(Subject=rep("SN",6), item.c=(1:6), Stim=c("XYZc02s03","XYZc01s30","XYZc02s29", "XYZc01s38", "XYZc02s11", "XYZc06w21"), Probe=c("XYzf02s03","XYZf01s30g","XYZf02s29w1","XYZf01s38sg","XYZf02s11s","XYZv06w21s1"), Resp=c(200, 100, 100, 100, 100, 200))
这是我的代码:
>dc$Resp<-as.character(dc$Resp) #column 5 in dc
dc$Probe<-as.character(dc$Probe)
dc$correct_response <- FALSE
for (i in 1:nrow(dc)) {
if (regexpr("^.*sg$", dc$Probe[i])==1 || regexpr("^.*s$", dc$Probe[i])==1 || regexpr("^.*w1$", dc$Probe[i])==1 || regexpr("^.*w3$", dc$Probe[i])==1 || regexpr("^.*s1$", dc$Probe[i])==1 || regexpr("^.*s2$", dc$Probe[i])==1 && dc[i,5]=="100") {(dc$correct_response[i]<- TRUE)}
if (regexpr("^.*\\d\\dg$", dc$Probe[i])==1 || regexpr("^.*\\d\\d$", dc$Probe[i])==1 && dc[i,5]=="200") {(dc$correct_response[i]<- TRUE)}
}
是不是有什么毛病我使用正则表达式?我用glob2rx()检查了它们,好像它们没问题...我使用“OR”(||)或/和“AND”(& &)不正确?我如何正确实施AND部分?我也尝试了与部分下面的代码,但它并没有改变什么:
regexpr("200", dc$Resp[i])==1
我读了正则表达式和控制流的R-帮助,但我还是不明白我的我做错了。在逻辑表达式上咨询其他网页也没有帮助我。
请帮忙!
@ttmaccer:瞧,一个小数据帧。我还不知道dput(),但它似乎是一个有用的函数。我现在要检查出来.. – kat