dt <-
data.frame(
id = 182,
group = c(rep("A", 20), rep("B", 32), rep("C", 50), rep("D", 80)),
y = rnorm(182)
)
# 採用 aggregate
set.seed(1234)
aggregate(dt$y, list(dt$group), function(x){
N <- length(x)
n <- c(15, 20, 25, 35)[which(c(20, 32, 50, 80) %in% N)] # 判斷要抽幾個
ind <- sample(1:N, n)
mean(x[ind])
})
# Group.1 x
# 1 A -0.2242983
# 2 B 0.3519958
# 3 C 0.1363614
# 4 D 0.4146774
# 採用 tapply
set.seed(1234)
tapply(dt$y, dt$group, function(x){
N <- length(x)
n <- c(15, 20, 25, 35)[which(c(20, 32, 50, 80) %in% N)] # 判斷要抽幾個
mean(x[sample(1:N, n)])
})
# A B C D
# -0.2242983 0.3519958 0.1363614 0.4146774
ZHQgPC0KICBkYXRhLmZyYW1lKAogICAgaWQgPSAxODIsCiAgICBncm91cCA9IGMocmVwKCJBIiwgMjApLCByZXAoIkIiLCAzMiksIHJlcCgiQyIsIDUwKSwgcmVwKCJEIiwgODApKSwKICAgIHkgPSBybm9ybSgxODIpCiAgKQoKIyDmjqHnlKggYWdncmVnYXRlCnNldC5zZWVkKDEyMzQpCmFnZ3JlZ2F0ZShkdCR5LCBsaXN0KGR0JGdyb3VwKSwgZnVuY3Rpb24oeCl7CiAgTiA8LSBsZW5ndGgoeCkKICBuIDwtIGMoMTUsIDIwLCAyNSwgMzUpW3doaWNoKGMoMjAsIDMyLCA1MCwgODApICVpbiUgTildICMg5Yik5pa36KaB5oq95bm+5YCLCiAgaW5kIDwtIHNhbXBsZSgxOk4sIG4pCiAgbWVhbih4W2luZF0pCn0pCiMgICBHcm91cC4xICAgICAgICAgIHgKIyAxICAgICAgIEEgLTAuMjI0Mjk4MwojIDIgICAgICAgQiAgMC4zNTE5OTU4CiMgMyAgICAgICBDICAwLjEzNjM2MTQKIyA0ICAgICAgIEQgIDAuNDE0Njc3NAoKIyDmjqHnlKggdGFwcGx5CnNldC5zZWVkKDEyMzQpCnRhcHBseShkdCR5LCBkdCRncm91cCwgZnVuY3Rpb24oeCl7CiAgTiA8LSBsZW5ndGgoeCkKICBuIDwtIGMoMTUsIDIwLCAyNSwgMzUpW3doaWNoKGMoMjAsIDMyLCA1MCwgODApICVpbiUgTildICMg5Yik5pa36KaB5oq95bm+5YCLCiAgbWVhbih4W3NhbXBsZSgxOk4sIG4pXSkKfSkKIyAgICAgICAgICBBICAgICAgICAgIEIgICAgICAgICAgQyAgICAgICAgICBEIAojIC0wLjIyNDI5ODMgIDAuMzUxOTk1OCAgMC4xMzYzNjE0ICAwLjQxNDY3NzQgCg==