如何随机化矢量并保持元素的频率固定?

时间:2016-10-22 03:40:15

标签: r

扩展this former question,如何随机化(随机化)以下向量

user

为了得到这样的东西:

user_id    first_name
1          tony
2          steve
3          bruce
4          thor
5          clint

甚至更好:

first_names

这样每个元素可以随机改变为另一个元素,但保持每个元素的数量不变?

3 个答案:

答案 0 :(得分:4)

你可以尝试这样的事情:从a1创建一个具有随机洗牌级别的因子,然后将其转换为整数:

as.integer(factor(a1, levels = sample(unique(a1), length(unique(a1)))))
# [1] 5 5 4 4 4 4 3 3 2 1 1 1

答案 1 :(得分:3)

似乎是rle及其反rep的完美应用:

rand_inverse_rle <- function(x) { x=sort(x)
   ord=sample (length(rle(x)$values) )  
   unlist( mapply( rep, rle(x)$values[ord], rle(x)$lengths[ord]))}
rand_inverse_rle(a1)
#----------
 [1] 3 3 4 5 5 5 2 2 2 2 1 1

这是我阅读满足自然语言要求所需的功能:

>  a1 = sample( c(1, 1, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5) )
> a1
 [1] 5 2 5 2 5 1 3 4 2 2 3 1
> rand_inverse_rle(a1)
 [1] 5 5 5 4 2 2 2 2 3 3 1 1
> rand_inverse_rle(a1)
 [1] 1 1 3 3 5 5 5 2 2 2 2 4
> rand_inverse_rle(a1)
 [1] 1 1 3 3 4 5 5 5 2 2 2 2

答案 2 :(得分:3)

数据:

a1 <- c(1, 1, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5)

第一步:

# extract values and their frequencies
val <- unique(a1)

tab <- table(a1)
freq <- tab[as.character(val)]

保持频率的原始顺序,但样本值

rep(sample(val), freq)
# [1] 4 4 1 1 1 1 3 3 5 2 2 2

保留原始频率但样本的值顺序

rep(sa <- sample(val), freq[as.character(sa)])
# [1] 4 2 2 2 2 3 3 1 1 5 5 5