2012-06-19 37 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