Использование dlply с pROC

Я пытаюсь применить функцию roc() из пакета pROC к определенным переменным из фрейма данных df, подмножества на df$site, состоящего из символов, которые выглядят как «01», «02», «03». Функция roc() возвращает список, поэтому я ожидаю, что мой объект roc_site будет списком, который, в свою очередь, содержит список результатов для каждого сайта.

roc_site <- dlply(
  .data = df, 
  .variables = "site", 
  .fun = roc, 
  .progress = "text",
  response = df$Risk,
  predictor = df$Rating, 
  na.rm = TRUE, plot = TRUE)

Это выполняется успешно, и roc_site представляет собой список, состоящий из одного списка для каждого сайта, но результаты для каждого сайта идентичны; он не разделил фрейм данных. Что мне не хватает?


person ahj    schedule 04.07.2012    source источник
comment
Иногда, когда вы не можете понять, что происходит, полезно заменить функцию внутри такого цикла разделения-приложения простым print(). Затем вы увидите, что передается.   -  person IRTFM    schedule 04.07.2012
comment
Это блестящая идея; Спасибо за чаевые!   -  person ahj    schedule 04.07.2012
comment
Или browser(), чтобы вы могли проверить, что вы получаете   -  person Calimo    schedule 23.07.2014


Ответы (1)


Функция, которую вы передаете .fun в dlply, должна принимать весь фрагмент фрейма данных в качестве своего (первого) аргумента.

Итак, в этом случае вы действительно хотите написать свою собственную небольшую функцию, которая возьмет ваш фрейм данных и вычислит то, что вы хотите. например

foo <- function(x){
    roc(x$Risk, x$Rating, na.rm = TRUE, plot = TRUE)
}

а затем передайте эту функцию .fun.

Причина, по которой вы получаете одинаковые результаты, заключается в том, что для каждого фрагмента dlply вызывает roc для вашего фрагмента, но передает df$Risk и df$Rating каждый раз, и это векторы для всех данных. установить.

person joran    schedule 04.07.2012
comment
Это было удивительно быстро и удивительно информативно. Огромное спасибо. - person ahj; 04.07.2012