代码之家  ›  专栏  ›  技术社区  ›  Maiasaura

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

  •  9
  • Maiasaura  · 技术社区  · 16 年前

    我有一个数据帧,其中的行太多,无法进行空间相关图。相反,我想为每个物种抓取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 回复  |  直到 16 年前
        1
  •  6
  •   Dirk is no longer here    16 年前

    它看起来应该可以工作,一旦你删除 , subset 从你的电话。

        2
  •  6
  •   Marek    16 年前

    当然,德克的回答是正确的,但为了增加更多的解释,我发表了自己的文章。

    为什么你的电话不工作?

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

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

    所以你可以清楚地看到你提供 function (见 class(samp) )作为第二个论点 subset . 你可以使用 samp(dfrm) 但不会有太大作用 samp 返回 data.frame 子集 需要逻辑向量。所以你可以用 SAMP(DFRM) 当它返回逻辑索引时。

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

    制作 子集 通过给他输入逻辑向量:

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

    我用40创建逻辑向量 TRUE (顺便说一句,当某些间谍少于40个案件时,它会起作用,然后它会全部返回)并随机发送。