2015-04-24 43 views
3

我對R來說比較新,所以這可能是一個簡單的問題。我試圖廣泛搜索答案,但無法找到答案。從R中的data.frame獲取大型數據集中排名前N的元素

我有形式的數據幀:

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 

這僅僅是從我的數據集圖示一個微小的樣品。我的數據幀超過一百萬行。第一個字符和nextword是字符類型。每個第一首可以有許多與它相關的nextwords,而有些可能只有一個。

如何從中生成另一個數據框,以便按照desc排序。每個'firstword'的freq順序,最多隻包含前6個nextwords。

我試過下面的代碼。

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

正如David的回答指出的那樣,在'group_by'之前執行'arrange'可能會更快。 (上面的joran的編輯把這個Q&A放​​在了我的stackoverflow feed中,呃,只是注意到它有多大。) – 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]