9

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

有人对如何做到这一点有想法吗?

4

2 回答 2

6

, subset一旦您从通话中删除,它看起来应该可以工作。

于 2010-05-27T17:03:19.270 回答
6

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

为什么你的电话打不通?

首先,您的语法是简写。它相当于

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(顺便说一句,当某些片段少于 40 个案例时,它会起作用,然后它会全部返回)并将其随机化。

于 2010-05-29T22:00:05.063 回答