2011-11-07 3 views
5

У меня есть кадр данных, содержащий 10 тыс. Строк, для данного столбца X У меня есть дублирующиеся значения. Как мы можем сделать, чтобы выбрать случайное ТОЛЬКО ОДИН РУК, содержащий это значение в этом столбце?Случайный выбор в кадре данных для уникальных строк

ответ

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

Спасибо, ребята, я пробую предложение Бена, Йоран, как это сделать, если я хочу применить это ко всему значению colum, потому что myVal, как было предложено в ваших фрагментах, изменяется вдоль моего столбца X, что означает, что у меня есть сотни из пяти, например, и сотни 8s и т. Д. И т. Д. – Rad

+0

Решение @ Рад Бена справится с этим; мой не будет. Мы истолковали ваш вопрос по-разному. – joran

6

Мой первый инстинкт был бы что-то вроде элегантного 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 
+0

Элегантный! Удивительный, спасибо Джон – Rad

Смежные вопросы