2015-02-11 2 views
1

Я использую функцию ddply (plyr), чтобы вычислить что-то отдельно по идентификатору участника (pid). Однако по какой-то причине он не возвращает отдельные значения на pid, но это же значение на всех pid.ddply не возвращает значения из функции split по переменной

Образец данных:

sdt<-c("Hit","Hit","Miss","Miss","False Alarm","Correct Reject","Correct Reject","Correct Reject", 
    "Hit","Hit","Hit","Miss","False Alarm","False Alarm","False ALarm","Correct Reject") 

pid<-c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2) 

adhd_p<-data.frame(sdt,pid) 

Функция:

ddply(adhd_p, "pid", summarise, 
    hitrate=(count(adhd_p$sdt=="Hit")[[2,2]])/((count(adhd_perf$sdt=="Hit")[[2,2]])+(count(adhd_p$sdt=="Miss")[[2,2]])), 
    falsealarmrate=(count(adhd_p$sdt=="False Alarm")[[2,2]])/((count(adhd_p$sdt=="False Alarm")[[2,2]])+(count(adhd_p$sdt=="Correct Reject")[[2,2]]))) 

Если это помогает понять, что я расчета ... Участники могут либо "Хит" (ответить утвердительно на цель), " «Мисс» (не отвечайте на цель), «Исправить отклонение» (не реагировать на дистрактор) или «False Alarm» (ответьте утвердительно на distractor). Таким образом, «hitrate» - количество хитов/хитов + промахов, а «falsealarmrate» - количество ложных тревог/ложных сигналов + правильный отклонение.

Что я делаю неправильно?

Спасибо за ваше время.

Edit: Над проблема решена очень быстро редактирования кода

ddply(adhd_p, "pid", summarise, 
    hitrate=(count(sdt=="Hit")[[2,2]])/((count(sdt=="Hit")[[2,2]])+(count(sdt=="Miss")[[2,2]])), 
    falsealarmrate=(count(sdt=="False Alarm")[[2,2]])/((count(sdt=="False Alarm")[[2,2]])+(count(adhd_p$sdt=="Correct Reject")[[2,2]]))) 

Я теперь понимаю, что мне нужно разделить более двух переменных, а не только один. Однако добавление переменной времени:

time<-c(1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8) 

и слияние его с другими

adhd_p<-data.frame(sdt,pid,time) 

Делает новый сценарий создания «подстрочный вне границ» ошибки.

ddply(adhd_p, .(pid,time), summarise, 
    hitrate=(count(sdt=="Hit")[[2,2]])/((count(sdt=="Hit")[[2,2]])+(count(sdt=="Miss")[[2,2]])), 
    falsealarmrate=(count(sdt=="False Alarm")[[2,2]])/((count(sdt=="False Alarm")[[2,2]])+(count(sdt=="Correct Reject")[[2,2]]))) 

Любые мысли?

ответ

2

Что нужно делать:

ddply(adhd_p, "pid", summarise, 
    hitrate=(count(sdt=="Hit")[[2,2]])/((count(sdt=="Hit")[[2,2]])+(count(sdt=="Miss")[[2,2]])), 
    falsealarmrate=(count(sdt=="False Alarm")[[2,2]])/((count(sdt=="False Alarm")[[2,2]])+(count(sdt=="Correct Reject")[[2,2]]))) 

Почему вы должны делать это:

Когда вы вызываете ddply, функция работает в пределах .data (adhd_p в вашем случае) в качестве локального пространства имен. Это похоже на вызов attach(adhd_p); вызывая имя столбца без ссылки на фреймворк, явно вызывает правильный столбец.

При поставке аргумента summarise функция разбивает векторы в локальном пространстве имен на основе столбцов идентификатора (в данном случае pid). Таким образом, если вы ссылаетесь на столбцы без ссылки на ядро ​​данных явно, как указано выше, вычисления будут выполняться с частью столбца sdt, соответствующей каждому pid.Однако, если вы явно ссылаетесь на столбец и dataframe (adhd_p$sdt в вашем случае), он просто вытягивает весь вектор из глобального пространства имен и не разбивает его соответствующим образом.

Edit: Код ниже и менее грязный и не вызовет ошибку, если одно из значений отсутствует:

ddply(adhd_p, .(pid, time), summarise, 
     hitrate=(sum(sdt=="Hit"))/(sum(sdt=="Hit"))+(sum(sdt=="Miss")), 
     falsealarmrate=(sum(sdt=="False Alarm"))/(sum(sdt=="False Alarm"))+(sum(sdt=="Correct Reject"))) 
+0

Фантастический, спасибо за объяснение! Это помогает сделать это так. – smgmu

+0

В качестве последующего вопроса, как бы повторить описанную выше процедуру, но разделить на вторую переменную (скажем, была ли переменная «время», по которой каждый участник менялся)? Я попытался изменить «pid» на c («pid», «time»), но он возвращает ошибку: «Ошибка: индекс за пределами границ» – smgmu

+0

Аргумент '.variables' может принимать вектор, поэтому вы можете использовать' ddply (adhd_p, c ("pid", "time"), ...) '. Это создаст каждую комбинацию, найденную в кадре данных (pid 1 в момент времени 1, pid 1 в момент времени 2, pid 2 в момент времени 1 и т. Д.). – Joe

1

Я не вникал в то, почему то, что вы делаете это неправильно, но вот ответ, который может помочь:

ddply(
    adhd_p, "pid", summarize, 
    hitrate=sum(sdt == "Hit")/sum(sdt %in% c("Hit", "Miss")), 
    falsealarmrate=sum(sdt == "False Alarm")/sum(sdt %in% c("False Alarm", "Correct Reject")) 
) 

Производит:

pid hitrate falsealarmrate 
1 1 0.50  0.2500000 
2 2 0.75  0.6666667 
+0

Ключ, кажется, удаление явной ссылки на dataframe (adhd_p $ SDT) является ключом к проблеме. Спасибо. – smgmu

Смежные вопросы