我有一个向量:
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