在数据框中随机选择唯一行

5

我有一个包含10000行的数据框,对于给定的列X,我有重复的值。我们该怎么做才能随机选择一个仅包含此列中此值的行?

2个回答

6
您的问题并不是非常清楚,但我猜您想对整个数据框进行子采样,每个“重复类”只保留一个(随机选择的)行。像这样:

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

应该可以工作(未经测试!


1
OP的(神秘的)问题的这种解释似乎比我的更有可能,我原本要建议使用df[sample(which(df$X == myVal),1),] - joran
1
谢谢大家,我正在尝试Ben的建议。Joran,在您的代码片段中,如果我想将此应用于所有列值,该怎么办呢?因为myVal如您所建议地改变了我的X列,这意味着我有数百个5和数百个8等等。 - Rad
@Rad Ben的解决方案可以处理这个问题,而我的则不能。我们对你的问题有不同的理解。 - joran
这需要这么长时间是正常的吗?我有一个包含100万行数据的巨大数据框,但至少它没有崩溃 :) - Rad
1
@Rad 一般来说,ddply 以其优雅简洁而闻名,但不一定快速。请参考下面的答案,考虑另一个选项。 - John Colby

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, ]
}

模拟一些数据(这里有许多独特的值):

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))

比较这两种方法:

> 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 

优雅!太棒了,谢谢 John。 - Rad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接