r - 仅从分组/排序数据中选择前 n 个值

标签 r dplyr grouping ranking

我有一个包含 4 个组的数据框(由第 1 列中的类别“a”和“b”以及第 2 列中的类别“X”和“Y”定义)。我想根据第 4 列中的值对第 3 列中的属性进行排名,但特别是在第 1 列和第 2 列中的组内(AX、AY、BX、BY),然后仅选择前 n 个(例如,n = 2)每个组的值。

arrange(col1, col2, desc(col4)) 用于排列数据,但由于数据在技术上并未分组,因此像 top_n 这样的函数仅返回顶部整个列表的 n 个值。我想过使用 slice_max 但无法在我的受限网络上安装来自 GitHub 的 dplyr 测试版。最好的方法是什么?

原始数据:

col1    col2    col3    col4
a       X       pat     1
b       Y       dog     2
b       X       leg     3
a       X       hog     4                   
b       Y       egg     5
a       Y       log     6
b       X       map     7
b       Y       ice     8
b       X       mat     9
a       Y       sat     10

arrange(col1, col2, desc(col4)) 给出

col1    col2    col3    col4
a       X       hog     4
a       X       pat     1
a       Y       sat     10
a       Y       log     6                   
b       X       mat     9
b       X       map     7
b       X       leg     3
b       Y       ice     8
b       Y       egg     5
b       Y       dog     2

但我不知道如何将其过滤为仅前 2 个值。

(下面的输入代码示例)

col1 <- c('a','b','b','a','b','a','b','b','b','a')
col2 <- c('X','Y','X','X','Y','Y','X','Y','X','Y')
col3 <- c('pat','dog','leg','hog','egg','log','map','ice','mat','sat')
col4 <- c(1,2,3,4,5,6,7,8,9,10)

df <- data.frame(col1,col2,col3,col4)

colA <- c('a','a','a','a','b','b','b','b','b','b')
colB <- c('X','X','Y','Y','X','X','X','Y','Y','Y')
colC <- c('hog','pat','sat','log','mat','map','leg','ice','egg','dog')
colD <- c(4,1,10,6,9,7,3,8,5,2)

df1 <- data.frame(colA,colB,colC,colD)

最佳答案

我们可以在按“colA”、“colB”分组后使用top_n

library(dplyr)
df %>% 
     group_by(colA, colB) %>%
     top_n(2)

关于r - 仅从分组/排序数据中选择前 n 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61432341/

相关文章:

r - .Rnw 文件中的 Perl : the 'tilde' character

R:对数尺度的图像强度

r - dplyr 过滤器中的标量比较

r - 使用 bind_rows 将向量列表转换为数据帧

Solr 分组空字段

r - 在不使用while和double for循环的情况下在R中创建一副纸牌

R xgboost on caret 尝试执行分类而不是回归

r - 根据列类有条件地改变列

javascript - 没有分隔符的数字字母表

.net - 一种对加权对象列表进行排序和分组的算法