【问题标题】:Using for loop and Extracting the data without duplication (dplyr & foreach)使用 for 循环并提取数据而不重复(dplyr 和 foreach)
【发布时间】:2020-07-28 01:38:37
【问题描述】:

我正在使用 RpostgreSQL、dplyr 和 foreach 包分析数据。

总数据50万行,目标组5000。

我想为每个目标提取 4 个对照组。因此,对照组的总N为20,000。

问题是,在提取的 20,000 人中,不应该有重复的值,但会有重复的。并且控件不应该在trt组中。

我的代码有重复值。我该怎么办?

非常感谢


我使用的代码形式如下。

controlgroup <- trtgroup[1,] %>% select(person_id,enroll_date,measurement_date,age,value,gender,case_number) %>% .[0,]


system.time({
  controlgroup <- foreach(i=1:50, .combine=rbind, .packages=c('dplyr','lubridate')) %dopar% {
    target_patient <- allo_case[i,] %>% select(person_id,enroll_date,measurement_date,age,value,gender,case_number)
    cont_list <- controlgroup %>% select(person_id)
    control_tmp1 <- enroll5_m %>% filter((gender == target_patient[6] %>% as.numeric) &  # gender
                                                (age >= target_patient[4] %>% as.numeric - 5 & age <= target_patient[4] %>% as.numeric + 5) & # age +- 5
                                                (!(person_id %in% (cont_list %>% select(person_id)))) &
                                                (!(person_id %in% (trtgroup %>% select(person_id)))) %>% slice(1:4)
    sample_n_number <- if_else(nrow(control_tmp1) >= 4, 4, nrow(control_tmp1) %>% as.double())
    control_tmp2 <- control_tmp1 %>% sample_n(sample_n_number) %>% mutate(case_number = i)
    return(control_tmp2)
  }
})

【问题讨论】:

    标签: r foreach dplyr


    【解决方案1】:

    一种方法是创建一个与您的数据大小相同的整数随机向量,然后将其拆分为一个包含 5000 个向量的列表,每个向量包含 4 个整数。然后根据此列表选择您的控制组。

    d <- sample.int(20000, 20000, replace = FALSE)
    split(d, ceiling(seq_along(d)/4))
    

    例如,将mtcars 分成 8 个不重叠的随机组:

    set.seed(1724)
    df <- mtcars
    d <- sample.int(32, 32, replace = FALSE)
    i <- split(d, ceiling(seq_along(d)/4))
    control <- lapply(i, function(x, df) df[x,], df = df)
    

    或者,purrr::map() 可能会更好地扩展:

    control <- purrr::map(i, ~df[.x,], df = df)
    

    https://stackoverflow.com/a/17773112/8675075https://stackoverflow.com/a/3321659/8675075

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      相关资源
      最近更新 更多