如何根据同一列的计数从两个不同的数据帧中采样?

时间:2019-07-18 16:00:08

标签: r random

我有2个具有相同数据结构的不同数据帧

  1. df1,响应为“是”(美国各州列)
  2. df2,响应为“否”(美国各州为列)

我想从两个df收集样本,并制作1个指定大小的样本数据帧。我想保持样本数据集平衡。 例如,如果我从df1采样,从纽约州获得50磅,那么我要从df2随机获得50个。

这是示例dput()链接https://drive.google.com/open?id=1cMeKvUfjDp6HBidue3ET8QWqsC6d6oyt

我已经提供了从df中提取样本并对其进行混洗但无法合并第2部分的功能

sample12<- function(df1,df2,size) {
  a<-df1[sample(nrow(df1),size/2,replace = T),] 
  b<-df2[sample(nrow(df2),size/2,replace = T),]
  s1<-bind_rows(a,b)
  s2<-s1[sample(1:nrow(s1)),]
  assign('s1',s2,.GlobalEnv)
}

2 个答案:

答案 0 :(得分:0)

这是如何按国家分层。

首先,计算状态频率。然后,以频率作为概率权重使用sample()。

sample12<- function(df1,df2,size) {

  a.freqs <- summary(factor(df1$sitecode))
  b.freqs <- summary(factor(df2$sitecode))
  a<-df1[sample(nrow(df1),size/2,replace = T, prob=a.freqs),] 
  b<-df2[sample(nrow(df2),size/2,replace = T, prob=b.freqs),]
  s1 <- rbind(a, b)
  return(s1[ sample(size), ])
}

注释。

  1. 请勿使用assign,例如:ever。返回值。
  2. 我无法正确测试代码,因为您的示例数据仅包含阿拉斯加;-)

答案 1 :(得分:0)

这是经过反复试验的我的版本。此方法称为分层随机抽样

以指定大小从两个数据帧(df1和df2)中抽取50%作为样本

sample12<- function(df1,df2,size,variable) {
  cat( 
    paste( 
      "please enter variable in  '' ", " Enter the final size of sample " ,' ', sep = '\n \n'
    )
  )


  if(!require(splitstackshape)){
    install.packages("splitstackshape")
    library(splitstackshape)
  }
  if(!require(dplyr)){
    install.packages("dplyr")
    library(dplyr)
  }
  a<-df1[sample(nrow(df1),size/2,replace = T),]
  freq<-summary(factor(a[,variable]))
  print(freq)
  b<-data.frame(stratified(df2,group = variable,size = freq))
  s1<-bind_rows(a,b)
  s2<-s1[sample(1:nrow(s1)),]
  print(summary(factor(s2[,variable])))
  assign('s1',s2,.GlobalEnv)
}