Создание условного оператора в R

У меня есть фрейм данных, который выглядит так:

> head(Data1A)
        Prime Target CorrectAnswer Accuracy   RT   Block TrialType
1     bezaaid barkme    PseudoWord        1 3450 Block 1        NA
2       hazen lemmet          Word        1 1108 Block 1        NA
3  bergtoppen slavin          Word        1 1160 Block 1        NA
4       wekte gareel          Word        1 1250 Block 1        NA
5      zessen studio          Word        1  557 Block 1        NA
6 nauwkeurige hotens    PseudoWord        1  882 Block 1        NA

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

Псевдокод:

Для каждой ячейки в Data1A$TrialType, если соответствующая ячейка в Data1A$Block равна Block 2 или Block 3 и соответствующая строка в Data1A$CorrectAnswer равна Word ИЛИ если соответствующая ячейка в Data1A$Block равна «Блоку 4» или «Блоку 5» и соответствующая ячейка в Data1A$CorrectAnswer равна PseudoWord, то соответствующая ячейка в TrialType будет равна Regular иначе, если соответствующая ячейка в Data1A$Block равна Block 1 или Block 6 ИЛИ если соответствующая ячейка в Data1A$Block равна Block 2 или Block3 и соответствующая строка в Data1A$CorrectAnswer равно pseudoWord ИЛИ если соответствующая ячейка в Data1A$Block равна Block 4 или Block 5 и соответствующая ячейка в Data1A$CorrectAnswer равна Word, то соответствующая ячейка в Data1A$TrialType равна Random

Надеюсь, это понятно. Я буду проверять, если есть сомнения относительно моих намерений с псевдокодом.


person HernanLG    schedule 18.01.2013    source источник


Ответы (1)


Я действительно получаю головной убор, чтобы упростить вашу логику здесь.

Но это должно сработать.

Я генерирую некоторые данные

dat <- read.table(text =        "Prime Target CorrectAnswer Accuracy   RT   Block TrialType
                  1     bezaaid barkme    PseudoWord        1 3450 'Block 4'        NA
                  2       hazen lemmet          Word        1 1108 'Block 5'        NA
                  3  bergtoppen slavin          Word        1 1160 'Block 4'        NA
                  1     bezaaid barkme    PseudoWord        1 3450 'Block 5'        NA
                  2       hazen lemmet          Word        1 1108 'Block 2'        NA
                  3  bergtoppen slavin          Word        1 1160 'Block 3'        NA
                  1     bezaaid barkme    PseudoWord        1 3450 'Block 2'        NA
                  2       hazen lemmet          Word        1 1108 'Block 3'        NA
                  3  bergtoppen slavin          Word        1 1160 'Block 1'        NA
                  4       wekte gareel          Word        1 1250 'Block 6'        NA
                  5      zessen studio          Word        1  557 'Block 1'        NA
                  6 nauwkeurige hotens    PseudoWord        1  882 'Block 3'        NA",header = T,row.names = NULL)

Затем я реализую вашу логику:

transform(dat,
          TrialType= ifelse(Block %in% c('Block 4','Block 5'),
                            ifelse(CorrectAnswer =="Word" ,"Random","Regular"),
                            ifelse(Block  %in% c('Block 2','Block 3'),
                                   ifelse(CorrectAnswer =="Word" ,"Regular","Random"),
                                   'Random')))

Вот результат

  row.names       Prime Target CorrectAnswer Accuracy   RT   Block TrialType
1          1     bezaaid barkme    PseudoWord        1 3450 Block 4   Regular
2          2       hazen lemmet          Word        1 1108 Block 5    Random
3          3  bergtoppen slavin          Word        1 1160 Block 4    Random
4          1     bezaaid barkme    PseudoWord        1 3450 Block 5   Regular
5          2       hazen lemmet          Word        1 1108 Block 2   Regular
6          3  bergtoppen slavin          Word        1 1160 Block 3   Regular
7          1     bezaaid barkme    PseudoWord        1 3450 Block 2    Random
8          2       hazen lemmet          Word        1 1108 Block 3   Regular
9          3  bergtoppen slavin          Word        1 1160 Block 1    Random
10         4       wekte gareel          Word        1 1250 Block 6    Random
11         5      zessen studio          Word        1  557 Block 1    Random
12         6 nauwkeurige hotens    PseudoWord        1  882 Block 3    Random
person agstudy    schedule 18.01.2013
comment
Спасибо за вашу помощь. к сожалению, код не делает то, что я хотел. Вероятно, это моя вина, так как я сделал ошибку в псевдокоде (уже исправлено). Я имею в виду ссылку на значение столбца «CorrectAnswer», а не на столбец «цель». Все остальное остается прежним. Тем не менее, ваш код назначал Random всем испытаниям из блоков 1, 2 и 3 и регулярно всем испытаниям из блоков 4 и 5 (в этом конкретном data.frame не было ячеек блока 6) - person HernanLG; 18.01.2013
comment
@Hernan_L Я обновляю свой ответ новым data.frame, содержащим больше примеров. Пожалуйста результат и подскажите какая строчка не правильная.? - person agstudy; 18.01.2013
comment
Большое спасибо @agstudy! Я просто заменил «dat» на имя моего data.frame, конечно, но теперь код работает отлично! Большое спасибо за вашу помощь, вы сэкономили мне бесчисленное количество часов ручной работы :) - person HernanLG; 18.01.2013
comment
@Hernan_L, если вы удовлетворены, вы можете принять ответ! установив флажок слева. - person agstudy; 18.01.2013
comment
@Арун, ты видел это! Удивительно, как ОП может понимать такую ​​логику и писать на английском, но не может сделать это с помощью R... - person agstudy; 18.01.2013
comment
Просто небольшой комментарий. Чтобы навсегда изменить data.frame с помощью кода (вместо того, чтобы просто видеть распечатанный результат), я переопределил data.frame, как с кодом из agstudy. Итак, это: Data1A ‹- код agstudy - person HernanLG; 18.01.2013
comment
@Hernan_L да .. в моем коде изменить начальный data.frame dat <- transform(dat,...) - person agstudy; 18.01.2013