假设我的样本数据如下所示。
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。我希望连续排名能够处理原始数据框中的许多重复值。任何帮助表示赞赏。
感谢。
答案 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