从R中的data.frame获取大型数据集中的前N个排序元素

时间:2015-04-24 08:32:53

标签: r sorting dataframe plyr

我对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

这只是我的数据集中的一个小样本。我的数据帧超过一百万行。 firstword和nextword是字符类型。每个firstword可以有许多与之关联的下一个词,而有些可能只有一个。

如何从中生成另一个数据帧,使其按desc排序。每个'firstword'的freq顺序,最多只包含前6个nextwords。

我尝试了以下代码。

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

这适用于我的数据的较小子集,但是当我在整个数据上运行时,内存不足。

2 个答案:

答案 0 :(得分:5)

这是使用data.table包的同样有效的方法。 首先,您不需要在每个组中安排freq,只需进行一次排序即可,效率更高。所以一种方法就是

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

另一种方式(可能更有效)是使用.I参数( I ndex)找到索引,然后找到子集

indx <- df[order(-freq), .I[seq_len(6)], by = firstword]$V1
df[indx]

答案 1 :(得分:3)

为此目的创建了

dplyr包以处理大型数据集。试试这个

library(dplyr)

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