Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 我的if-condition有什么问题?_Regex_R_If Statement_Logical Operators_Control Flow - Fatal编程技术网

Regex 我的if-condition有什么问题?

Regex 我的if-condition有什么问题?,regex,r,if-statement,logical-operators,control-flow,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条件时,我可以看到它们在条件的或部分上运行得很好,这意味着只有当dc

所以我一直在试图找出我的if条件到底出了什么问题,但我一无所获。我对R还是一个新手,所以也许我不理解一些非常基本的概念

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

到目前为止,它所做的是,对于这两种if条件,不管dc的第5列中的值如何,它都会将每个FALSE变为TRUE。当我单独运行if条件时,我可以看到它们在条件的或部分上运行得很好,这意味着只有当dc$Probe中的字符串与或部分中指定的字符串之一匹配时,代码才会生成TRUE。然而,和部分似乎被忽略了?因此,当我运行完整的代码时,我得到一个只有TRUE的列,这不是我想要的

编辑:只有当探测中的字符串以某个模式结束(如我编写的两个if条件中的任意一个所指定),并且Resp中的对应值对于第一个条件中指定的模式是“100”,对于第二个条件中指定的模式是“200”,我才应该得到TRUE。因此,对于以(sg | s | w1 | w3 | s1 | s2)结尾的字符串,Resp必须是“100”才能得到真值,对于以(\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))
我阅读了关于正则表达式和控制流的R-help,但我仍然不知道我做错了什么。查阅其他关于逻辑表达式的网页对我也没有帮助


请帮忙

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

我想知道是否可以简化为以下内容:

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

谢谢,我修好了。这个错误是我在这里复制代码时发生的,在我的脚本中它是正确的。@ttmaccer:voila,一个小数据帧。我还不知道dput(),但它似乎是一个有用的函数。我现在要检查一下…谢谢,你的代码看起来更优雅了!但是,当我查看数据帧的第7358行时,我发现:
7358 SN 178 XYZc06w26 XYZv06w26s1 200 TRUE
现在这里的值不应该为TRUE,因为探测“XYZv06w26s1”在s1中结束。出了什么问题?这两个条件中的任何一个都需要满足,而不是两者都需要满足。没错。然而,为了使最后一列为真,Probe和Resp需要有一个特定的值。你说探针有两个数字是什么意思?第7358行中的探测在s1结束,因此根据cond1,Resp需要bee 100才能在最后一列中实现。但是,即使Resp为200,它也会成为现实。为什么?是的,是的,是的!:)我也错过了你解决方案中的那个错误。像这样的事情花费了我好几个小时的生命。。。所以,你的代码工作得很好!不过,我还是想教育自己:我的代码出了什么问题?我的意思是,除了任务过于冗长和复杂之外,这不是和你做的一样吗?换句话说?天哪,这是括号!!!!我现在只想上吊。。。好的,非常感谢您的帮助,代码现在看起来好多了。是我错了,还是这也比我的循环运行得快?
regexpr("200", dc$Resp[i])==1
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