在特定约束条件下对数据帧进行采样的最有效方法是什么?
例如,假设我有一个名称和工资目录,如何选择3以使其总和不超过某个值。我只是使用了一个while循环,但这似乎效率很低。
答案 0 :(得分:1)
一种方法是从完整的数据框开始并对一个案例进行抽样。创建一个数据框,其中包含薪水小于约束减去所选薪水的所有案例。从中选择第二个案例并重复创建剩余案例集的过程以供选择。如果你得到你需要的号码就停止(3),或者在任何时候数据框中都没有可供选择的情况(拒绝你到目前为止的情况并重新开始采样程序)。
请注意,不同的方法会为包含的案例创建不同的概率分布;通常它不会是统一的。
答案 1 :(得分:1)
您的数据集有多大?如果它很小(而且实际上很小,取决于你的硬件),你可以只列出所有三个组,计算总和,并从中进行采样。
## create data frame
N <- 100
salary <- rnorm(N))
## list all possible groups of 3 from this
x <- combn(salary, 3)
## the sum
sx <- colSums(x)
sxc <- sx[sx<1]
## sampling with replacement
sample(sxc, 10, replace=TRUE)
答案 2 :(得分:1)
你可能面临组合爆炸。这模拟了一组20的EE的3种组合的选择,其中工资的平均值为60和sd 20.它表明,从1140组合的枚举中,你会发现只有263的工资总和小于150。 / p>
> sum( apply( combn(1:20,3) , 2, function(x) sum(salry[x, "sals"]) < 150))
[1] 200
> set.seed(123)
> salry <- data.frame(EEnams = sapply(1:20 ,
function(x){paste(sample(letters[1:20], 6) ,
collapse="")}), sals = rnorm(20, 60, 20))
> head(salry)
EEnams sals
1 fohpqa 67.59279
2 kqjhpg 49.95353
3 nkbpda 53.33585
4 gsqlko 39.62849
5 ntjkec 38.56418
6 trmnah 66.07057
> sum( apply( combn(1:NROW(salry), 3) , 2, function(x) sum(salry[x, "sals"]) < 150))
[1] 263
如果您有1000个EE,那么您将拥有:
> choose(1000, 3) # Combination possibilities
# [1] 166,167,000 Commas added to output