Мога ли да използвам функция като аргумент за връщане в ifelse в R

В момента проучвам задача за съпоставяне с извадка при маймуни. Искам да преценя колко често е избран определен стимул, независимо от правилността на избора.

За да направя това, имам рамка с данни df с 6288 реда и 6 колони („Маймуна“, „Сесия“, „Проба“, „Съвпадение“, „Фолио“, „Успех“), от които само последните три са важни сега .

Данните в df$Match и df$Foilса имената на стимулите (низ), а df$Success е двоичен. df$Match и df$Foil са съставени от 65 различни имена на стимули, които включих във вектор Match.Foil.

Сега искам да преброя колко често се щраква върху снимка (част от вектора Match.Foil) във всичките 6288 опита. Тоест всеки път, когато името е част от df$Match & df$Success == "1" ИЛИ когато df$Foil & df$Success == "0".

Опитах се да създам вектор с броя кликвания за всяка част от Match.Foil по този начин:

Pic.clicked= vector(mode="numeric", length= length(Match.Foil))

for (i in 1:length(Match.Foil)){
    Pic.clicked[i] = ifelse(
           df$Match == Match.Foil[i] & df$Success == "1")|
                (df$Foil== Match.Foil[i] & df$Success == "0"),
           Pic.clicked[i] +1, 
           Pic.clicked[i] +0)
      }

И така, както виждате, исках да използвам функциите Pic.clicked + 1 и Pic.clicked + 0 като връщания, ако изразът е TRUE или FALSE. Не работи и ми дава грешката:

В Pic.clicked[i] = ifelse((df$Match == Match.Foil[i] & ... : броят на елементите за замяна не е кратно на дължината на замяната

Някой има ли идея как да изградя подходящ брояч? Мислех да използвам switch, но нямам опит с тази функция и изглежда не работи, както ми трябва. Опитах също да го стартирам за 6288 цикъла, но това дава същото предупреждение.


person Lotte Victor    schedule 28.10.2016    source източник
comment
Имаме нужда от малко повече информация; кратък възпроизводим пример би бил много полезен. Освен това не е ясно какво имате предвид, че казвате, че се опитвате да върнете функция; Pic.clicked[i]+1 не е функция, а числова стойност.   -  person Aaron left Stack Overflow    schedule 28.10.2016


Отговори (1)


можете да използвате sum(), което на булев вектор кара TRUE да се брои като 1:

for (i in 1:length(Match.Foil)) {
    Pic.clicked[i]= sum((Stage4.pics$Match == Match.Foil[i] & Stage4.pics$Success == "1")|
                        (Stage4.pics$Foil== Match.Foil[i] & Stage4.pics$Success == "0"))
}
person carlo    schedule 28.10.2016
comment
Благодаря за всички ваши приноси! Още не успях да отговоря, защото бях много зает. Намерих решението, проблемът не беше в синтаксиса вътре в този цикъл, а че имаше нужда от втори цикъл около този. Ако някой се интересува мога да пусна кода. Благодаря отново! - person Lotte Victor; 27.03.2017