r - 如何在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))
但我知道这可能更合适。
解决方案
懒惰的方式
这是一种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()
推荐阅读
- javascript - 基于 HTMLElement 上的属性覆盖
- hibernate - 使用 Protobuf 定义类作为 Hibernte 实体类:org.hibernate.MappingException
- python - 如何将具有不同 0 值的字符串转换为从 1 到 4 的单个值(n° 的值不为零)
- twisted - twisted:使用 uniq Perspective Broker TCP 连接进行多次登录
- usrp - 为什么 multi_usrp 不支持多个 B210 无线电?
- c - 遇到断点时如何在劳特巴赫中保存堆栈帧
- powerapps - 如何将多个数据字符串拆分为html表格
- oracle - 如何在Oracle中查找Long Datatype中列值的最大长度
- javascript - Javascript Clicker 客户队列按钮调用密码
- reactjs - `extraHeight` 属性对`react-native-keyboard-aware-scroll-view` 有什么作用