2012-06-19 35 views
1

所以我一直在试图弄清楚我的if条件有什么问题,但我无处可去。我对R还是个新手,所以也许我在这里不理解一些非常基本的概念?我的if -condition有什么问题?

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

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

编辑:只有当Probe中的字符串以特定模式结束(如果两个条件中的任意一个指定)并且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部分?我也尝试了与部分下面的代码,但它并没有改变什么:

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

我读了正则表达式和控制流的R-帮助,但我还是不明白我的我做错了。在逻辑表达式上咨询其他网页也没有帮助我。

请帮忙!

+0

@ttmaccer:瞧,一个小数据帧。我还不知道dput(),但它似乎是一个有用的函数。我现在要检查出来.. – kat

回答

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 
+0

谢谢,你的代码看起来更优雅!不过,当我查看数据帧的第7358行时,发现这一点:'7358 SN 178 XYZc06w26 XYZv06w26s1 200 TRUE'现在这里的值不应该为真,因为探针“XYZv06w26s1”在s1中结束。什么地方出了错? – kat

+0

需要满足两个条件中的任何一个,而不是两个。那是对的。但是,Probe和Resp需要有一定的值才能使最后一列为TRUE。 Probe是什么意思,有2位数字?第7358行的探针在s1结束,因此,根据cond1,Resp需要在最后一列获得TRUE。但是,即使Resp是200,它也是TRUE。为什么? – kat

+0

看到我上面的编辑。这说明了吗? – kat

0

首先,您在第一个if声明的第二个和第三个子句之间缺少逻辑运算符。

+0

谢谢,我解决了它。当我在这里复制代码时发生了这个错误,在我的脚本中它是正确的。 – kat