如何使用ddply按组对数据进行子采样?

Mai*_*ura 9 r plyr

我有一个包含太多行的数据框,无法进行空间相关图.相反,我想为每个物种抓取40行并在该子集上运行我的相关图.

我编写了一个函数来对数据框进行子集,如下所示:

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

现在我想在更大的数据框架中将此函数应用于每个物种.

当我尝试类似的东西

culled_data = ddply (larger_data, .(species), subset, samp)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Error in subset.data.frame(piece, ...) : 
  'subset' must evaluate to logical
Run Code Online (Sandbox Code Playgroud)

有人知道如何做到这一点?

Dir*_*tel 6

, subset从您的通话中删除后,它看起来应该可以正常工作.


Mar*_*rek 6

德克答案当然是正确的,但为了增加额外的解释,我发布了自己的答案.

为什么你的电话不起作用?

首先,您的语法是速记.它相当于

ddply(larger_data, .(species), function(dfrm) subset(dfrm, samp))
Run Code Online (Sandbox Code Playgroud)

所以你可以清楚地看到你提供function(见class(samp))作为第二个参数subset.你可以使用samp(dfrm),但它也不会工作导致samp返回data.framesubset需要逻辑向量.所以你可以samp(dfrm)在它返回逻辑索引时使用.

在这种情况下如何使用子集?

subset工作由喂他与逻辑矢量:

ddply (larger_data, .(species), subset, sample(seq_along(species)<=40))
Run Code Online (Sandbox Code Playgroud)

我创建了带有40的逻辑向量TRUE(顺便说一下,当某些spieces少于40个案例,然后它返回所有)时随机它.