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