2015-04-24 2 views
3

Я относительно новичок в R, так что это может быть простой вопрос. Я пробовал искать экстенсивно для ответа, но не смог найти его.Получение верхних N отсортированных элементов из data.frame в R для большого набора данных

У меня есть кадр данных в виде:

firstword nextword freq 
a   little  23 
a   great  46 
a   few  32 
a   good  15 
about  the  57 
about  how  34 
about  a   48 
about  it   27 
by   the  36 
by   his  52 
by   an   12 
by   my   16 

Это лишь небольшой пример для иллюстрации из моего набора данных. Мой DataFrame составляет более миллиона строк. firstword и nextword - это тип символа. У каждого первого слова может быть много связанных с ним нескольких слов, в то время как у некоторых может быть только одно.

Как сгенерировать еще один кадр данных из этого, чтобы он сортировался по desc. порядок частоты для каждого «первого слова» и содержит максимум 6 самых лучших слов.

Я пробовал следующий код.

small = ddply(df, "firstword", summarise, nextword=nextword[order(freq,decreasing=T)[1:6]]) 

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

ответ

3

dplyr пакет создан для этой цели, чтобы обрабатывать большие наборы данных. попробуйте это

library(dplyr) 

df %>% group_by(firstword) %>% arrange(desc(Freq)) %>% top_n(6) 
+0

работал отлично! Не подумал бы об этом. Спасибо –

+0

Как видно из ответов Дэвида, было бы быстрее выполнить '' '' 'перед' group_by'. (редактирование joran выше помещало это Q & A в мой поток stackoverflow. Упс, только что заметил, сколько ему лет.) – Frank

5

Вот так же эффективный подход с использованием data.table пакета. Во-первых, вам не нужно устраивать freq в каждую группу, сортируя только один раз, достаточно и более эффективно. Так один из способов было бы просто

library(data.table) 
setDT(df)[order(-freq), .SD[seq_len(6)], by = firstword] 

другой способ (возможно, более эффективным), чтобы найти индексы, используя .I аргумент (я NDEX), а затем подмножество

indx <- df[order(-freq), .I[seq_len(6)], by = firstword]$V1 
df[indx] 
Смежные вопросы