组内洗牌向量,保留顺序

shuffle vector within groups, preserving order

我有一个向量:

x = {x1, x2, x3, ..., xn}

还有一些组:

g = {g1, g2, g3, ..., gn}

我想打乱每个组中的矢量元素,但保留原始组顺序。例如:

x = c(1, 2, 3, 4, 5)
g = c('a', 'b', 'a', 'b', 'b')

好的解决方案:

shuffled_x = c(3, 5, 1, 4, 2)
shuffled_g = c('a', 'b', 'a', 'b', 'b')

错误的解决方案:

shuffled_x = c(3, 1, 4, 5, 2)
shuffled_g = c('a', 'a', 'b', 'b', 'b')

我已经知道如何在组内洗牌了:

y = tapply(x, g, sample)

只是不确定如何让它们保持正确的顺序。

我认为 ave 会在维护组的元素之间洗牌:

ave(x, g, FUN = sample)
#[1] 1 4 3 5 2

ave(x, g, FUN = sample)
#[1] 3 4 1 2 5

ave(x, g, FUN = sample)
#[1] 3 2 1 4 5