2012-06-19 4 views
1

Итак, я пытался выяснить, что не так с моим if-условием, но я никуда не ухожу. Я до сих пор новичок в R, так что, может быть, я не понимаю некоторые основные понятия здесь?Что случилось с моим if -condition?

У меня есть dataframe (dc), к которому я добавил столбец с логическим «FALSE». Теперь я хочу изменить каждый FALSE в TRUE на основе значений в двух столбцах dc (dc $ Probe и dc $ Resp), которые я задал с помощью regexpr().

Что он делает до сих пор, так это то, что для обоих условий if он изменяет каждый FALSE на TRUE независимо от значений в столбце 5 постоянного тока. Когда я выполняю if-условия отдельно, я вижу, что они, похоже, отлично работают в OR-части условия, то есть код генерирует TRUE только тогда, когда строки в dc $ Probe соответствуют одной из строк, указанных в OR -часть. Однако, AND-часть, кажется, игнорируется? Таким образом, когда я запускаю полный код, я получаю столбец с только ИСТИННЫМ, что не то, что я хочу.

Редактирование: я должен получить ИСТИННЫЙ, только если строка в Зонде заканчивается определенным шаблоном (как указано в любом из двух условий, которые я написал), и если соответствующее значение в Resp является «100» для шаблонов указанный в моем первом условии или «200» для шаблонов, указанных в моем втором условии. Таким образом, для строк, заканчивающихся на (sg | s | w1 | w3 | s1 | s2), Resp должен быть «100», чтобы получить TRUE, а для строк, заканчивающихся на (\ d \ dg | \ d \ d), Resp должен быть «200», чтобы получить ИСТИННЫЙ. Все остальные случаи должны быть ЛОЖНЫМИ. Например, если строка заканчивается на s1, а соответствующее значение в Resp равно 200, код должен возвращать FALSE.

Edit: Некоторые примеры данных:

>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: вуаля, немного dataframe. Я еще не знал о dput(), но он кажется полезной функцией. Я собираюсь проверить это сейчас. – kat

ответ

2

Im интересно, если все это можно свести к следующему:

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

Любое из двух условий должно быть удовлетворено, а не оба из них. это верно. Однако для зонда AND для Resp необходимо определенное значение для того, чтобы последний столбец был TRUE. Что вы имеете в виду под Probe имеет 2 цифры?Зонд в строке 7358 здесь заканчивается на s1, поэтому, согласно cond1, Resp должен быть 100, чтобы получить TRUE в последнем столбце. Но, он получает ИСТИННУЮ, хотя Resp - 200. Почему? – kat

+0

см. Мои правки выше. Означает ли это это? – kat

0

С одной стороны, вам не хватает логического оператора между 2-м и 3-м положениями вашего первого предложения if.

+0

Спасибо, я исправил это. Эта ошибка произошла, когда я скопировал код здесь, в моем сценарии это правильно. – kat