我有一个包含10k行的数据框,对于给定的列X,我有重复的值,我们如何才能在该列中随机选择只包含该值的一行?
答案 0 :(得分:6)
您的问题并不完全清楚,但我假设您要对整个数据框进行子采样,每个“重复类”保留一个(随机选择的)行。像
这样的东西library(plyr)
subsampled_data <- ddply(mydata,.(X),
function(x) {
x[sample(nrow(x),size=1),]
})
应该有效(未经测试!)
答案 1 :(得分: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