【问题标题】:what is wrong with my if -condition?我的 if 条件有什么问题?
【发布时间】:2012-06-19 12:10:06
【问题描述】:

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

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

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

编辑:只有当 Probe 中的字符串以某种模式结束(如我编写的两个 if 条件中的任一个中指定的那样)并且 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 部分?我还尝试了 AND 部分的以下代码,但它没有改变任何东西:

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

我阅读了关于正则表达式和控制流的 R 帮助,但我仍然看不出我做错了什么。查阅其他有关逻辑表达式的网页也对我没有帮助。

请帮忙!

【问题讨论】:

  • @ttmaccer :瞧,一个小数据框。我还不知道 dput() ,但它似乎是一个有用的功能。我现在要去看看..

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


【解决方案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

【讨论】:

  • 谢谢,您的代码看起来更优雅了!不过,当我查看数据框的第 7358 行时,我发现:7358 SN 178 XYZc06w26 XYZv06w26s1 200 TRUE 现在这里的值不应该为真,因为 Probe "XYZv06w26s1" 以 s1 结尾。出了什么问题?
  • 需要满足两个条件中的一个,而不是两个。没错。但是,为了使最后一列为 TRUE,Probe AND Resp 需要有一个特定的值。探针有 2 位数字是什么意思?此处第 7358 行中的探针以 s1 结束,因此,根据 cond1,Resp 需要蜜蜂 100 才能在最后一列中得到 TRUE。但是,即使 Resp 为 200,它也会变为 TRUE。为什么?
  • 是的,是的! :) 我也错过了您解决方案中的那个错字。像这样的东西花费了我数小时的生命......所以,你的代码完美无缺!不过,我想教育自己:我的代码有什么问题?我的意思是,除了任务过于冗长和复杂之外,这不是和你做的一样吗,换句话说?
  • 天哪,它是括号!!!!我现在只想上吊……好的,非常感谢您的帮助,代码现在看起来好多了。我错了还是这也比我的循环运行得更快?
【解决方案2】:

一方面,您在第一个 if 语句的第二和第三子句之间缺少一个逻辑运算符。

【讨论】:

  • 谢谢,我修好了。当我在这里复制代码时发生了这个错误,在我的脚本中它是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多