代码之家  ›  专栏  ›  技术社区  ›  LucasMation

在data.table中跨组(不在组内)随机排序

  •  2
  • LucasMation  · 技术社区  · 6 年前

    假设我想订购 iris 数据集(作为 data.table )按物种分类,保持观察结果按物种分组,并在不同物种间随机排序。

    我该怎么做?

    我不是说在群体(物种)中产生随机顺序。

    我的直觉是写下面的代码。但它实际上产生了种内随机变量。好吧,至少这个问题是可以重复的

    d <- iris %>% data.table
    set.seed('12345')
    d[,g:=runif(.N),Species]
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Mathscosta    6 年前

    或者你可以:

    e <- d[, .N, Species]
    e[, g2 := runif(.N)]
    d <- e[, .(Species, g2)][d, on = 'Species']
    
        2
  •  2
  •   Henrik plannapus    6 年前

    你可以在 i 是的。一个较小的例子:

    d <- data.table(Species = rep(letters[1:4], each = 2), ri = 1:8)
    set.seed(1)
    d[.(sample(unique(Species))), on = "Species"]
    #    Species ri
    # 1:       b  3
    # 2:       b  4
    # 3:       d  7
    # 4:       d  8
    # 5:       c  5
    # 6:       c  6
    # 7:       a  1
    # 8:       a  2
    
        3
  •  1
  •   Hack-R    6 年前

    我们可以从一系列1…n中随机抽样,其中n是因子水平( Species )有问题。

    然后我们将新的顺序映射到列并按其排序。分成几个步骤进行说明,如下所示:

    tmp      <- sample_n(as.data.frame(seq(1,length(unique(d$Species)))),3)[,1]
    d$index  <- tmp[as.numeric(d$Species)]
    d        <- d[order(d$index),]
    

    您可以将其压缩为一行/步骤:

    d <- d[order(sample_n(as.data.frame(seq(1,length(unique(d$Species)))),3)[,1][as.numeric(d$Species)]),]