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

时间:2010-05-27 16:49:03

标签: r plyr

我有一个数据框,行数太多,无法进行空间相关图。相反,我想为每个物种抓取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 个答案:

答案 0 :(得分:6)

从您的通话中删除, subset后,它看起来应该有效。

答案 1 :(得分:6)

Dirk的答案当然是正确的,但是为了添加额外的解释,我发布了自己的答案。

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

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

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

因此,您可以清楚地看到您提供function(请参阅class(samp))作为subset的第二个参数。您可以使用samp(dfrm),但由于samp返回data.framesubset需要逻辑向量,因此无效。因此,当它返回逻辑索引时,您可以使用samp(dfrm)

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

通过向他提供逻辑向量来使subset工作:

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

我使用40 TRUE创建逻辑向量(顺便说一下,当某些spieces少于40个案例,然后它返回所有内容时)它会随机发生。

相关问题