Произвольно выбрать на фрейме данных, для уникальных строк - PullRequest
5 голосов
/ 07 ноября 2011

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

Ответы [ 2 ]

6 голосов
/ 08 ноября 2011

Мой первый инстинкт был бы чем-то вроде элегантного решения 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 
6 голосов
/ 07 ноября 2011

Ваш вопрос не совсем понятен, но я предполагаю, что вы хотите отобрать весь фрейм данных, сохранив одну (произвольно выбранную) строку на «дублирующий класс».Что-то вроде

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

Должно работать ( не проверено! )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...