Как мне сэмплировать данные по группам, используя ddply? - PullRequest
9 голосов
/ 27 мая 2010

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

Я написал функцию для подстановки фрейма данных следующим образом:

    samp <- function(dataf)
{
    dataf[sample(1:dim(dataf)[1], size=40, replace=FALSE),]
}

Теперь я хочу применить эту функцию к каждому виду в большом кадре данных.

Когда я пытаюсь что-то вроде

culled_data = ddply (larger_data, .(species), subset, samp)

Я получаю эту ошибку:

Error in subset.data.frame(piece, ...) : 
  'subset' must evaluate to logical

У кого-нибудь есть идеи, как это сделать?

Ответы [ 2 ]

6 голосов
/ 30 мая 2010

Ответ Дирка, конечно, правильный, но чтобы добавить дополнительное объяснение, я отправлю свое.

Почему ваш звонок не работает?

Прежде всего, ваш синтаксис является сокращением. Это эквивалентно

ddply(larger_data, .(species), function(dfrm) subset(dfrm, samp))

, чтобы вы могли четко видеть, что вы предоставляете function (см. class(samp)) в качестве второго аргумента subset. Вы можете использовать samp(dfrm), но это тоже не сработает, потому что samp return data.frame и subset нужен логический вектор. Таким образом, вы можете использовать samp(dfrm), когда он возвращает логическое индексирование.

Как использовать подмножество в этом случае?

Заставьте subset работать, накормив его логическим вектором:

ddply (larger_data, .(species), subset, sample(seq_along(species)<=40))

Я создаю логический вектор с 40 TRUE (кстати, он работает, когда для некоторых видов меньше 40 случаев, затем он возвращает все) и случайным образом.

6 голосов
/ 27 мая 2010

Похоже, это должно работать, как только вы удалите , subset из вашего звонка.

...