我做了一个简单的例子来说明我想要实现的目标。 假设我有这个数据框:
x <- data.frame(a=1:10,b = factor(c("a","a","a","a","a","b","b","b","b","b")),
gender = factor(c("boy","girl","boy","girl","girl","boy","boy","boy","girl","boy")))
数据框有10个观测值。 40%的女孩,60%的男孩。 50%a,50%b。
我希望能够形成一个随机样本来保持样本中所选关键变量的比例,所以在这种情况下我希望在我的样本中,女孩的比例为40%,男孩的比例为60 %,也是50%,和b 50%。 我怎样才能做到这一点?我在互联网上找到的例子都假设所有变量都有一个共同的比例,这对我的目的不利。 谢谢!
答案 0 :(得分:2)
如对足够大的样本的评论中所述,子样本中的比率应该相似。对于较小的数据集,这是一种方法:
library(tidyverse)
library(caret)
创建一个组,这是两个因素的相互作用,并根据这个分裂。由于您的样本非常小,因此无法产生确切的比例(没有方法可以):
x %>%
select(b, gender) %>%
group_by(b, gender) %>%
group_indices() -> ind
split1 <- createDataPartition(as.factor(ind), p = 0.5)[[1]]
table(x[split1,2])
#output
a b
2 2
table(x[split1,3])
#output
boy girl
3 1
有两倍大的数据集:
x <- rbind(x, x)
x %>%
select(b, gender) %>%
group_by(b, gender) %>%
group_indices() -> ind
split1 <- createDataPartition(as.factor(ind), p = 0.5)[[1]]
table(x[split1,2])
#output
a b
5 5
table(x[split1,3])
#output
boy girl
6 4
尝试其他比例:
split1 <- createDataPartition(as.factor(ind), p = 0.7)[[1]]
table(x[split1,2])
#output
a b
8 8
table(x[split1,3])
#output
boy girl
9 7