所以我一直试图找出我的 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 帮助,但我仍然看不到我做错了什么。查阅其他有关逻辑表达式的网页也对我没有帮助。
请帮忙!