2015-07-20 2 views
1

Я хочу создать произвольное подмножество data.tabledf, которое очень велико (около 2 миллионов строк). Таблица данных имеет столбец веса, wgt, который показывает, сколько наблюдений каждая строка представляет. Для создания вектора номеров строк, которые я хочу, чтобы извлечь, я поступайте следующим образом:Команда sample() слишком медленная в R

я получить точное количество наблюдений:

ns<- length(df$wgt) 

я получаю количество требуемых линий (30% выборки):

lines<-round(0.3*ns) 

Я вычислить вектор вероятностей:

pr<-df$wgt/sum(df$wgt) 

А потом вычислить вектор номеров строк, чтобы получить подвыборки:

ssout<-sample(1:ns, size=lines, probs=pr) 

Конечная цель состоит в том, чтобы подмножество данных с помощью df[ssout,]. Однако R зацикливается при вычислении ssout.

Есть ли более быстрый/более эффективный способ сделать это?

Спасибо!

+1

Использование 'sample.int' будет немного обрезаться, если вы укажете все аргументы, которые также заставят вас * не * создать вектор' 1: ns' в первую очередь (как @DavidArenburg, предлагаемый пропуском часть '1:') –

+2

Судя по вашему описанию («wgt, который указывает, сколько наблюдений каждая строка представляет»), вы должны сэмплировать с заменой. Если одна строка имеет вес в десять процентов, вы должны иметь возможность рисовать ее несколько раз. – Frank

+1

Я предполагаю, что это не имеет ничего общего с data.table (в котором он помечен); Я не уверен, хотя ... – Frank

ответ

3

Я предполагаю, что df - это краткое описание набора данных с повторными наблюдениями (с wgt, являющимся счетчиком повторений). В этом случае единственным полезным способом отбора из него будет замена; и собственно 30% выборка будет 30% от реального населения, .3*sum(wgt): ряды

# example data 
wgt <- sample(10,2e6,replace=TRUE) 
nobs<- sum(wgt) 
pr <- wgt/sum(wgt) 

# select rows 
system.time(x <- sample.int(2e6,size=.3*nobs,prob=pr,replace=TRUE)) 
# user system elapsed 
# 0.20 0.02 0.22 

Выборочных без замены принимает навсегда на моем компьютере, но и то, что я не думаю, что нужно сделать здесь.

+1

+1; пример, который показывает, почему выборка без замены неверна, - это сценарий, где все веса равны 0, за исключением одного (или все равны 1, а одно смехотворно велико). – eddi

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