【问题标题】:shuffle vector within groups, preserving order在组内洗牌向量,保持顺序
【发布时间】:2018-03-30 01:55:25
【问题描述】:

我有一个向量:

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)

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

【问题讨论】:

    标签: r permutation shuffle


    【解决方案1】:

    我认为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
    

    【讨论】:

    • 正是我想要的。谢谢!
    • 我查看了“ave”的源代码,但我不明白“split(x, g)
    • 基本上ave 根据组拆分x(这里是g),所以在我们的例子中,它将有两个组(1、3)和(2、4、5)然后将FUN 参数(此处为sample)中提到的函数分别应用于每个组,并返回它们与x 的原始长度相同。这是我的理解,我可能不完全正确。
    • @RonakShah,这太棒了。 Base R 从未停止让我感到惊讶。
    • @RonakShah 我不明白作业“split(x, g)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多