【问题标题】:randomly ordering across groups (not within group) in data.table在 data.table 中跨组(不在组内)随机排序
【发布时间】:2018-12-14 08:40:24
【问题描述】:

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

我该怎么做?

我不是在谈论在组(物种)中生成随机顺序。

我的直觉是写下面的代码。但它实际上创建了物种内随机变量。好吧,至少它使问题可以重现

d <- iris %>% data.table
set.seed('12345')
d[,g:=runif(.N),Species]

【问题讨论】:

  • 所以基本上你只是希望物种顺序按照组出现的顺序是随机的?
  • @Hack-R,正确
  • 我想我可以分 3 步完成: set.seed('12345') d[,u:=runif(.N)] d[,u2:=max(u),Species ] d[order(u2)] %>% 查看

标签: r random data.table


【解决方案1】:

您可以在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

【讨论】:

    【解决方案2】:

    我们可以从系列 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),]
    

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

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

    【讨论】:

      【解决方案3】:

      或者你可以这样做:

      e <- d[, .N, Species]
      e[, g2 := runif(.N)]
      d <- e[, .(Species, g2)][d, on = 'Species']
      

      【讨论】:

        猜你喜欢
        • 2015-03-04
        • 1970-01-01
        • 2012-11-19
        • 2022-12-09
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-24
        相关资源
        最近更新 更多