Мой первый инстинкт был бы чем-то вроде элегантного решения 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))
Сравните 2 метода:
> 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