【问题标题】:from data table, randomly select one row per group从数据表中,每组随机选择一行
【发布时间】:2016-02-26 12:08:51
【问题描述】:

我正在寻找一种从数据表中选择行的有效方法,以便我为特定列中的每个唯一值都有一个代表行。

让我举一个简单的例子:

require(data.table)

y = c('a','b','c','d','e','f','g','h')
x = sample(2:10,8,replace = TRUE)
z = rep(y,x)
dt = as.data.table( z )

我的目标是通过对 z 列中的每个字母 a-h 采样一行来对数据表 dt 进行子集化。

【问题讨论】:

    标签: r data.table subset random-sample


    【解决方案1】:

    OP 在示例中只提供了一个列。假设原始数据集中有多列,我们按'z'分组,sample每组从行序列中取1行,得到行索引(.I),提取行索引(@ 987654323@) 并使用它来子集 'dt' 的行。

    dt[dt[ , .I[sample(.N,1)] , by = z]$V1]
    

    【讨论】:

    • 请同时添加相关信息。
    • 这是完美的,正是我想要的。是的,假设有多个列,我的问题数据表有 200 多列,但为了清楚和理解(就我而言),我保持示例简单。
    【解决方案2】:

    你可以使用 dplyr

    library(dplyr)
    
    dt %>%
      group_by(z) %%
      sample_n(1)
    

    【讨论】:

    • 请解释一下为什么您的提案解决了 OP 的问题。
    • 似乎是这里的一种类型。试试group_by(z) %>% 而不是group_by(z) %%
    【解决方案3】:

    我认为按行对 data.table 进行洗牌然后应用 unique(...,by) 也可以。组由by 组成,之前的洗牌会在每个组内向下渗透:

    # shuffle the data.table row-wise
    dt <- dt[sample(dim(dt)[1])]
    # uniqueness by given column(s)
    unique(dt, by = "z")
    

    下面是一个更大的 data.table 示例,按 3 列分组。与@akrun 的解决方案相比,似乎给出了相同的分组:

    set.seed(2017)
    dt <- data.table(c1 = sample(52*10^6), 
                     c2 = sample(LETTERS, replace = TRUE), 
                     c3 = sample(10^5, replace = TRUE), 
                     c4 = sample(10^3, replace = TRUE))
    # the shuffling & uniqueness
    system.time( test1 <- unique(dt[sample(dim(dt)[1])], by = c("c2","c3","c4")) )
    # user  system elapsed 
    # 13.87    0.49   14.33 
    
    # @akrun' solution
    system.time( test2 <- dt[dt[ , .I[sample(.N,1)] , by = c("c2","c3","c4")]$V1] )
    # user  system elapsed 
    # 11.89    0.10   12.01 
    
    # Grouping is identical (so, all groups are being sampled in both cases)
    identical(x=test1[,.(c2,c3)][order(c2,c3)], 
              y=test2[,.(c2,c3)][order(c2,c3)])
    # [1] TRUE
    

    对于每组多于一行的抽样检查here

    【讨论】:

      猜你喜欢
      • 2019-12-02
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多