如何从保留r中重复项的数据框中选择前n个值

时间:2016-02-04 12:45:08

标签: r rank

假设我的样本数据如下所示。

   id freq
    1    4
    2    3
    3    2
    4    2
    5    1

freq 列告诉每个id的频率。问题是:我想要前3个频率。输出应该是......

   id freq
    1    4
    2    3
    3    2
    4    2

我使用了以下代码。

d$rank <- rank(-d$freq,ties.method="min")

其中d是我的数据框。我使用rank命令,以便我以后可以选择前3个频率。 我得到的输出是:

id freq rank
 1    4    1
 2    3    2
 3    2    3
 4    2    3
 5    1    5

问题是缺少等级4。我希望连续排名能够处理原始数据框中的许多重复值。任何帮助表示赞赏。

感谢。

2 个答案:

答案 0 :(得分:3)

这是另一种基础R方法:

df[cumsum(!duplicated(df$freq))<4,]
#  id freq
#1  1    4
#2  2    3
#3  3    2
#4  4    2

这假设数据已经按降序排列(如示例所示)。

如果你打算使用像dplyr这样的外部库,我建议使用top_n

library(dplyr)
top_n(df, 3, freq)
#  id freq
#1  1    4
#2  2    3
#3  3    2
#4  4    2

答案 1 :(得分:1)

假设&#39; freq&#39;按降序排序,我们得到&{39; freq&#39;的unique个元素,选择带head的前3个元素,使用%in%获取那些元素的逻辑索引在&#39; freq&#39;列,subset行。

subset(df1, freq %in% head(unique(freq),3))
#  id freq
#1  1    4
#2  2    3
#3  3    2
#4  4    2

如果我们使用的是rank,那么来自dense_rank的{​​{1}}将是一个选项

dplyr

使用library(dplyr) df1 %>% filter(dense_rank(-freq) < 4) frank的其他选项(由@David Arenburg提供),

data.table