扩展this former question,如何随机化(随机化)以下向量
user
为了得到这样的东西:
user_id first_name
1 tony
2 steve
3 bruce
4 thor
5 clint
甚至更好:
first_names
这样每个元素可以随机改变为另一个元素,但保持每个元素的数量不变?
答案 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