我有一个包含10000行的数据框,对于给定的列X,我有重复的值。我们该怎么做才能随机选择一个仅包含此列中此值的行?
library(plyr)
subsampled_data <- ddply(mydata,.(X),
function(x) {
x[sample(nrow(x),size=1),]
})
应该可以工作(未经测试!)
我的第一反应可能是像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
df[sample(which(df$X == myVal),1),]
。 - joranddply
以其优雅简洁而闻名,但不一定快速。请参考下面的答案,考虑另一个选项。 - John Colby