我的if条件有什么问题?

时间:2012-06-19 12:10:07

标签: regex r if-statement logical-operators control-flow

所以我一直试图找出我的if条件有什么问题,但我无处可去。我还是R的新手,所以也许我在这里不了解一些非常基本的概念?

我有一个数据帧(dc),我在其中添加了一个逻辑" FALSE"的列。现在我想根据我使用regexpr()指定的两列dc(dc $ Probe和dc $ Resp)中的值将每个FALSE更改为TRUE。

到目前为止,它的作用是,对于两个if条件,无论dc的第5列中的值如何,它都会将每个FALSE更改为TRUE。当我单独运行if条件时,我可以看到它们似乎在条件的OR部分正常工作,这意味着当dc $ Probe中的字符串与OR中指定的字符串之一匹配时,代码仅生成TRUE -部分。然而,AND部分似乎被忽略了?因此,当我运行完整的代码时,我得到的列只有TRUE,这不是我想要的。

编辑:只有当Probe中的字符串以某种模式结束时(如我写的两个条件中的任何一个中指定的那样)并且Resp中的相应值是" 100&#34时,我才会得到TRUE ;对于在我的第一个条件中指定的模式或者" 200"对于我的第二个条件中指定的模式。因此,对于以(sg | s | w1 | w3 | s1 | s2)结尾的字符串,Resp必须为" 100"得到一个TRUE,对于以(\ d \ dg | \ d \ d)结尾的字符串,Resp必须是" 200"得到一个真实的。所有其他情况应该是假的。例如,如果字符串以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()检查了它们,看起来它们还可以......我使用&#34; OR&#34; (||)或/和&#34; AND&#34; (&amp;&amp;)不正确?如何正确实现AND部分?我还为AND-part尝试了以下代码,但它没有改变任何东西:

regexpr("200", dc$Resp[i])==1

我在正则表达式和控制流程上阅读了R-help,但我仍然没有看到我做错了什么。在逻辑表达式上查询其他网页也没有帮助我。

请帮忙!

2 个答案:

答案 0 :(得分:2)

我想知道是否可以将其全部缩减为以下内容:

dc<- read.table(header=T,text="Subject item.c      Stim       Probe Resp
      SN      1 XYZc02s03   XYzf02s03  200
      SN      2 XYZc01s30  XYZf01s30g  100
      SN      3 XYZc02s29 XYZf02s29w1  100
      SN      4 XYZc01s38 XYZf01s38sg  100
      SN      5 XYZc02s11  XYZf02s11s  100
      SN      6 XYZc06w21 XYZv06w21s1  200")

cond1<-regexpr("^.*(sg|s|w1|w3|s1|s2)$", dc$Probe)==1 & dc$Resp==100
cond2<-regexpr("^.*(\\d\\dg|\\d\\d)$", dc$Probe)==1 & dc$Resp==200
dc$correct_response<-cond1|cond2

答案 1 :(得分:0)

首先,您在第一个if语句的第2和第3个子句之间缺少逻辑运算符。