【问题标题】:Sample a subset of dataframe by group, with sample size equal to another subset of the dataframe按组对数据帧的子集进行采样,样本大小等于数据帧的另一个子集
【发布时间】:2014-03-23 16:18:01
【问题描述】:

这是我假设的数据框;

location<- as.factor(rep(c("town1","town2","town3","town4","town5"),100))
visited<- as.factor(rbinom(500,1,.4)) #'Yes or No' variable
variable<- rnorm(500,10,2)
id<- 1:500
DF<- data.frame(id,location,visited,variable)

我想创建一个新的数据框,其中每个位置的 0 和 1 的数量相等。我想通过对每个位置的 0 进行随机抽样来实现这一点(因为 0 比 1 多)。

我发现这个解决方案可以按组抽样;

library(plyr)
ddply(DF[DF$visited=="0",],.(location),function(x) x[sample(nrow(x),size=5),])

我为 size 参数输入了“5”,以便代码运行,但我不知道如何将“size”参数设置为等于 DF$visited==1 的观察次数。

我怀疑答案可能在我审查过的其他问题中,但它们对我来说有点太高级了。

感谢您的帮助。

【问题讨论】:

    标签: r subset plyr


    【解决方案1】:

    用好ddply的关键是要明白它会:

    1. 将原始数据帧按组分解为更小的数据帧
    2. 然后,对于每个组,它将调用您为其提供的函数,该函数的工作是将数据帧转换到一个新的数据帧*
    3. 最后,它会将所有转换后的小数据帧重新拼接在一起。

    考虑到这一点,这是一种(我认为)可以解决您的问题的方法。

    sampleFunction <- function(df) {
      # Determine whether visited==1 or visited==0 is less common for this location, 
      # and use that count as our sample size.
      n <- min(nrow(df[df$visited=="1",]), nrow(df[df$visited=="0",]))
      # Sample n from the two groups (visited==0 and visited==1).
      ddply(df, .(visited), function(x) x[sample(nrow(x), size=n),])
    }
    
    newDF <- ddply(DF,.(location),sampleFunction)
    
    # Just a quick check to make sure we have the equal counts we were looking for.
    ddply(newDF, .(location, visited), summarise, N=length(variable))
    

    工作原理

    主要的ddply 只是按位置分解DF 并应用sampleFunction,它完成了繁重的工作。

    sampleFunction 采用较小的数据帧之一(在您的情况下,每个位置一个),并从中采样相等数量的 visited==1visited==0。它是如何做到的? 调用ddply:这一次,使用location 将其分解,因此我们可以从1 和0 中采样。

    另外请注意,我们正在根据出现次数较少的子组(0 或 1)来计算每个位置的样本量,因此即使 0 并不总是多于 1,此解决方案也可以工作。

    【讨论】:

    • 很好的解决方案和解释。
    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多