【问题标题】:Looping function to avoid repeated code in stratified sampling with R循环函数,以避免使用 R 进行分层采样中的重复代码
【发布时间】:2021-02-03 21:53:32
【问题描述】:

我正在使用下面的代码对人群进行分层随机抽样,并根据性别和地区确定了先前的目标。可以看出,相同的代码重复了 3 次(每次使用 rbind 时)。有没有办法写一个循环函数,可以重复这个过程,这样我就不用写好几次了?

library(tidyverse)
population<- data.frame(region=rep(c("North", "South", "North", "South"),50000),
                        sex=rep(c("Male", "Female", "Female", "Male"),50000))

targets<- data.frame(region=c("North", "South", "North", "South"),
                     sex=c("Male", "Female", "Female", "Male"),
                     total=c(20,25,20,30)) 


n=0
n=n+1
sample<- population %>% filter(region==targets$region[[1]], 
                           sex==targets$sex[[1]]) %>% 
  slice_sample(n=targets$total[[1]])
n=n+1
sample<- sample %>%  rbind(population %>% filter(region==targets$region[[n]], 
                               sex==targets$sex[[n]]) %>% 
  slice_sample(n=targets$total[[n]]))
n=n+1
sample<- sample %>%  rbind(population %>% filter(region==targets$region[[n]], 
                               sex==targets$sex[[n]]) %>% 
  slice_sample(n=targets$total[[n]]))
n=n+1
sample<- sample %>%  rbind(population %>% filter(region==targets$region[[n]], 
                               sex==targets$sex[[n]]) %>% 
  slice_sample(n=targets$total[[n]]))

【问题讨论】:

    标签: r loops sampling


    【解决方案1】:

    感谢Harry Smith 提供的帮助,我找到了答案。它由他的代码的一个小调整组成:

    n = 4  
    sample_list <- list()
    for(i in 1:n){
      sample<- population %>% filter(region==targets$region[[i]], 
                                                       sex==targets$sex[[i]]) %>% 
                                   slice_sample(n=targets$total[[i]])
      sample_list[[i]] <- sample
    }
    
    a<-bind_rows(sample_list)
    

    【讨论】:

      【解决方案2】:

      类似的东西。它将dfs保存在一个列表中。

      n = 4  
      sample_list <- list()
      for(i in 1:n){
      sample<-rbind(population %>% filter(region==targets$region[[i]], 
                                                       sex==targets$sex[[i]]) %>% 
                                   slice_sample(n=targets$total[[i]]))
      sample_list[[i]] <- sample
      }
      

      【讨论】:

      • 感谢您的回答。在应用您的代码后跟bind_rows(sample_list) 我得到一个比它应该大得多的数据框。样本数据框应该有来自北方的 20 名男性,来自南方的 25 名女性等等(由“目标”数据集指定),总共有 95 个观察值。
      • 刚刚编辑了代码。它现在应该可以工作了。
      猜你喜欢
      • 2018-11-22
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多