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