1

所以我一直试图找出我的 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 中的相应值对于我第一个中指定的模式而言,我应该得到一个 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 帮助,但我仍然看不到我做错了什么。查阅其他有关逻辑表达式的网页也对我没有帮助。

请帮忙!

4

2 回答 2

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
于 2012-06-19T12:48:50.387 回答
0

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

于 2012-06-19T12:13:31.023 回答