我想获得一些如何处理这种方法的一般规则。我有大数据,但以下是其中的代表性示例:
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))
但我知道这可能是更合适。
答案 0 :(得分:0)
最后,我找到了答案。这非常简单,可能会提供最佳的拟合度。这是迭代的东西。
devtools::install_github("m-Py/minDiff")
library(minDiff)
xdf <- create_groups(edf, criteria_scale = c("group"),
criteria_nominal = c("condit"), sets_n = 5, repetitions = 5000)
您可以看到它的存在-取决于歪斜或不对称的数据量,它给人的感觉会更好或更糟。
查看依据:
xdf[order(xdf$newSet, xdf$condit, xdf$group),]
乌夫...
答案 1 :(得分:0)
惰性方式
这是一种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()