【问题标题】:How do I sub sample data by group using ddply?如何使用 ddply 按组对数据进行子采样?
【发布时间】:2023-04-09 09:14:01
【问题描述】:

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

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

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    从通话中删除 , subset 后,它看起来应该可以工作了。

    【讨论】:

    • 谢谢德克。做到了。也许有人可以解释一下子集如何在 ddply 中工作。
    • 不知道 -- 您可以像 ddply(larger_data[subset,], .(species), samp) 或通过 subset() 一样对数据进行子集化。
    【解决方案2】:

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

    【讨论】:

    • 我不喜欢做它应该做的事情! ddply (larger_data, .(species), subset, sample(seq_along(species)
    • @Mark 它应该从每个物种中随机选择 40 个案例。它不适合你?
    猜你喜欢
    • 2015-01-31
    • 2017-08-20
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多