Как делают меня sub демонстрационные данные группой, использующей ddply?

У меня есть кадр данных со слишком многими строками, чтобы смочь сделать пространственную коррелограмму. Вместо этого я хочу захватить 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

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

9
задан Maiasaura 27 May 2010 в 05:49
поделиться

2 ответа

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

6
ответ дан 2 November 2019 в 23:59
поделиться

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

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

Во-первых, ваш синтаксис - это сокращение. Он эквивалентен

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

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

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

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

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

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

6
ответ дан 2 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: