首页 > 解决方案 > 如何在R中按条件划分数据集

问题描述

我想了解一些如何处理这种方法的一般规则。我有大数据,但下面是它的代表性示例:

set.seed(2019)

myFun <- function(n = 50) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}
names = myFun()
group = round(runif(50, 0, 4))
condit = ifelse(round(runif(50, 0, 1.2)) > 0, "TRUE", "FALSE")
edf <- data.frame(names, group, condit, stringsAsFactors = F)
> head(edf)
       names group condit
1 NPWZX7229I     1  FALSE
2 FTANS2931N     0   TRUE
3 XUUGJ9010I     1  FALSE
4 THMIQ8703O     2   TRUE
5 NRLLS3573V     1   TRUE
6 LCETQ1320W     0  FALSE

问题是将这些数据划分(聚类)在 N 个具有约束的组上:

说N = 5,

每个组需要可能具有相同数量的 TRUE 和 FALSE 值(尽可能接近它,但没有 50% 的比率)

每个组需要从group列中获得相同数量的值。

因此,例如,对于 N=5,我们将手动获取:

names   group   condit
wrd0        0     TRUE
wrd1        0     TRUE
wrd2        1     TRUE
wrd3        1    FALSE
wrd4        2    FALSE
wrd5        2    FALSE
wrd6        3     TRUE
wrd7        3    FALSE
wrd8        4    FALSE
wrd9        4     TRUE

这是理想的,但如何为其他组自动复制呢?它是某个库(肯定是),但我不知道该使用什么。簇?或者也许是最小二乘的某种方法?使用什么库?谢谢。

随机拆分它的建议有一定的意义和结果:

split(edf, sample(1:N, nrow(df), replace=T))

但我知道这可能更合适。

标签: rleast-squares

解决方案


懒惰的方式

这是一种tidyverse通过随机抽样来实现的方法。

library(dplyr)
library(purrr)

edf %>%
  split(.$group) %>%
  map(~ sample_n(., size = 5, replace = T)) %>%
  bind_rows()

自定义方式

这是一种灵活的方式,您可以使用自己的条件进行扩展。在这里,我确保保证包含少于 5 次迭代的所有原始样本。如何处理倾斜采样取决于您。

library(dplyr)
library(purrr)

desired_sample_size = 5

conditional_sampling <- function(l){

    r = list(
      l %>% map(
                ~ sample_n(., 
                size = ifelse(nrow(.) < desired_sample_size, nrow(.), desired_sample_size), 
                replace = F)),
      l %>% map_if(~ desired_sample_size - nrow(.) > 0, 
                   ~ sample_n(., 
                              size = desired_sample_size - nrow(.), 
                              replace = T))
    )

    return(combine(r))
}

edf %>%
  split(.$group) %>%
  conditional_sampling() %>%
  bind_rows()

推荐阅读