对数据帧进行随机选择,以获得唯一的行

Rad*_*Rad 5 r

我有一个包含10k行的数据框,对于给定的列XI有重复的值,我们怎样才能在该列中随机选择只包含该值的一行?

Ben*_*ker 6

您的问题并不完全清楚,但我假设您要对整个数据框进行子采样,每个"重复类"保留一个(随机选择的)行.就像是

library(plyr)
subsampled_data <- ddply(mydata,.(X),
    function(x) {
          x[sample(nrow(x),size=1),]
    })
Run Code Online (Sandbox Code Playgroud)

应该工作(没有测试!)


Joh*_*lby 6

我的第一直觉就是Ben的优雅ddply解决方案.但是,现在知道你有这么大的数据集,肯定有更快的方法.如果您有许多独特的值,那么这将快几倍:

RemoveDups <- function(df, column) {
  inds = sample(1:nrow(df))  
  df   = df[inds, ]

  dups = duplicated(df[, column])
  df   = df[!dups, ]
  inds = inds[!dups]

  df[sort(inds, index=T)$ix, ]
}
Run Code Online (Sandbox Code Playgroud)

模拟一些数据(这里有许多唯一值):

n.row = 10^6
n.col = 3

set.seed(12345)
data  = data.frame(matrix(sample(1000, n.row*n.col, replace=T), nrow=n.row))
Run Code Online (Sandbox Code Playgroud)

比较两种方法:

> system.time(ddply(data, 'X1', function(x) x[sample(nrow(x), size=1), ]))
   user  system elapsed 
  3.264   0.921   4.315 
> system.time(RemoveDups(data, 'X1'))
   user  system elapsed 
  0.375   0.025   0.399 
Run Code Online (Sandbox Code Playgroud)