2016-02-29 4 views
1

это мой воспроизводимый пример:Как совместить различные условные обозначения в R?

SMTscenes.ACC SMTscenes.RESP TrialType 
0    4    Old 
0    3    Old 
0    r    New 
0    2    New 
0    1    New 
0    r    Old 
0    3    Old 
0    4    New 

Я начал с помощью следующей команды, чтобы избавиться от «г» так, что следующий условными придерживаться чисел, то, применяя условное:

levels(df$SMTscenes.RESP)[levels(df$SMTscenes.RESP)=="r"] <- "5" 
df$SMTscenes.ACC <- ifelse(df$SMTscenes.RESP >= '3' & df$TrialType == 'Old', '1', '0') 
df[is.na(df)] <- 1 
levels(df$SMTscenes.RESP)[levels(df$SMTscenes.RESP)=="5"] <- "r" 

Это дает

SMTscenes.ACC SMTscenes.RESP TrialType 
1    4    Old 
1    3    Old 
0    r    New 
0    2    New 
0    1    New 
1    r    Old 
1    3    Old 
0    4    New 

Вот идет сложная часть: Если я пытаюсь использовать следующее (для «New» сейчас):

levels(df$SMTscenes.RESP)[levels(df$SMTscenes.RESP)=="r"] <- "5" 
df$SMTscenes.ACC <- ifelse(df$SMTscenes.RESP <= '2' & df$TrialType == 'New', '1', '0') 
df[is.na(df)] <- 1 
levels(df$SMTscenes.RESP)[levels(df$SMTscenes.RESP)=="5"] <- "r" 

то, что произойдет, это, конечно, отменяет предыдущий шаг. Теперь я попытался настроить его по-разному, например, смешать условные выражения, но все это не помогло. Я хочу, чтобы конечный результат был следующим:

SMTscenes.ACC SMTscenes.RESP TrialType 
1    4    Old 
1    3    Old 
0    r    New 
1    2    New 
1    1    New 
1    r    Old 
1    3    Old 
0    4    New 

Итак, любые указатели на то, как этого достичь? Я бы сделал это вручную, но есть тысячи строк данных ... Вся помощь приветствуется.

+2

Можете ли вы объяснить словами, что вы пытаетесь сделать? –

+0

Конечно. Я пытаюсь написать сценарий с условными выражениями, которые достигают следующих условий: Если средний столбец (SMTscenes.RESP) равен 3,4 или r, и он устарел, тогда сделайте SMTscenes.ACC = 1; если средний столбец равен 1 или 2, и он новый, тогда сделайте SMTscenes.ACC = 1. Else, сделайте это 0. – Jay

ответ

1

Создайте каждый индекс отдельно, затем объедините с оператором OR (indx1 | indx2). И вместо того, чтобы изменения 'r' значения в '5' затем вперед и назад, добавьте его в качестве дополнительного условия:

indx1 <- as.numeric(df$SMTscenes.RESP) <= 2 & df$TrialType == "New" 
indx2 <- (as.numeric(df$SMTscenes.RESP) >= 3 | df$SMTscenes.RESP == 'r') & df$TrialType == "Old" 
df$SMTscenes.ACC <- as.integer(indx1 | indx2) 
df 
# SMTscenes.ACC SMTscenes.RESP TrialType 
# 1    1    4  Old 
# 2    1    3  Old 
# 3    0    r  New 
# 4    1    2  New 
# 5    1    1  New 
# 6    1    r  Old 
# 7    1    3  Old 
# 8    0    4  New 
+0

Это определенно то, что я искал. Большое спасибо! – Jay