组内洗牌向量,保留顺序
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
我有一个向量:
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