2015-04-24 67 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]