Regex 我的if-condition有什么问题?
所以我一直在试图找出我的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 编辑:一些示例数据: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
>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