带替换的样本,但限制要抽取的每个成员的最大频率

问题描述 投票:0回答:2

是否可以扩展 R 中的

sample
函数,使其在
replace = TRUE
时不返回超过 2 个相同元素?

假设我有一个清单:

l = c(1,1,2,3,4,5)

要对 3 个元素进行替换采样,我会这样做:

sample(l, 3, replace = TRUE)

有没有办法限制它的输出,以便最多只返回 2 个相同的元素?那么

(1,1,2)
(1,3,3)
是允许的,但
(1,1,1)
(3,3,3)
被排除在外?

r random sample
2个回答
8
投票
set.seed(0)

基本思想是将放回抽样转换为无放回抽样。

ll <- unique(l)          ## unique values
#[1] 1 2 3 4 5
pool <- rep.int(ll, 2)   ## replicate each unique so they each appear twice
#[1] 1 2 3 4 5 1 2 3 4 5
sample(pool, 3)          ## draw 3 samples without replacement
#[1] 4 3 5

## replicate it a few times
## each column is a sample after out "simplification" by `replicate`
replicate(5, sample(pool, 3))
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    4    2    2    3
#[2,]    4    5    1    2    5
#[3,]    2    1    2    4    1

如果您希望不同的值出现不同的次数,我们可以这样做

pool <- rep.int(ll, c(2, 3, 3, 4, 1))
#[1] 1 1 2 2 2 3 3 3 4 4 4 4 5

## draw 9 samples; replicate 5 times
oo <- replicate(5, sample(pool, 9))
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    5    1    4    3    2
# [2,]    2    2    4    4    1
# [3,]    4    4    1    1    1
# [4,]    4    2    3    2    5
# [5,]    1    4    2    5    2
# [6,]    3    4    3    3    3
# [7,]    1    4    2    2    2
# [8,]    4    1    4    3    3
# [9,]    3    3    2    2    4

我们可以在每一列上调用

tabulate
来统计
1, 2, 3, 4, 5
的出现频率:

## set `nbins` in `tabulate` so frequency table of each column has the same length
apply(oo, 2L, tabulate, nbins = 5)
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    2    2    1    1    2
#[2,]    1    2    3    3    3
#[3,]    2    1    2    3    2
#[4,]    3    4    3    1    1
#[5,]    1    0    0    1    1

所有列中的计数都满足我们设定的频率上限

c(2, 3, 3, 4, 1)


您能解释一下

rep
rep.int
之间的区别吗?

rep.int
不是
rep
的“整数”方法。它只是一个更快的原始函数,但功能比
rep
少。您可以从文档页面
rep
获取
rep.int
rep_len
?rep
的更多详细信息。


0
投票

确实,非常简单。

给出一些数据

a = c(1,2,3,4)

只需重复数据n次,然后使用replace = False进行采样

sample_replecement_constrain = function(muestra,constrain,size){
  
  muestra = rep(muestra,constrain)
  muestra = sample(muestra,size, replace = FALSE)
  
  return(muestra)
}

sample_replecement_constrain(a,2,7)

这应该对你有用!!

© www.soinside.com 2019 - 2024. All rights reserved.