我有一个数据框,行数太多,无法进行空间相关图。相反,我想为每个物种抓取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
任何人都有关于如何做到这一点的想法?
答案 0 :(得分:6)
从您的通话中删除, subset
后,它看起来应该有效。
答案 1 :(得分:6)
Dirk的答案当然是正确的,但是为了添加额外的解释,我发布了自己的答案。
首先,您的语法是速记。它相当于
ddply(larger_data, .(species), function(dfrm) subset(dfrm, samp))
因此,您可以清楚地看到您提供function
(请参阅class(samp)
)作为subset
的第二个参数。您可以使用samp(dfrm)
,但由于samp
返回data.frame
而subset
需要逻辑向量,因此无效。因此,当它返回逻辑索引时,您可以使用samp(dfrm)
。
通过向他提供逻辑向量来使subset
工作:
ddply (larger_data, .(species), subset, sample(seq_along(species)<=40))
我使用40 TRUE
创建逻辑向量(顺便说一下,当某些spieces少于40个案例,然后它返回所有内容时)它会随机发生。