仅从 grouped/sorted 数据中选择前 n 个值
Selecting only the top n values from grouped/sorted data
我有一个包含 4 个组的数据框(由第 1 列中的类别 "a" 和 "b" 以及第 2 列中的类别 "X" 和 "Y" 定义)。我想根据第 4 列中的值对第 3 列中的属性进行排名,但特别是在第 1 列和第 2 列(AX、AY、BX、BY)的组内,然后 select 仅前 n 个(例如, n = 2) 每组的值。
arrange(col1, col2, desc(col4))
用于排列数据,但由于数据未在技术上分组,因此 top_n
return 等函数只是整个列表的前 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)
我有一个包含 4 个组的数据框(由第 1 列中的类别 "a" 和 "b" 以及第 2 列中的类别 "X" 和 "Y" 定义)。我想根据第 4 列中的值对第 3 列中的属性进行排名,但特别是在第 1 列和第 2 列(AX、AY、BX、BY)的组内,然后 select 仅前 n 个(例如, n = 2) 每组的值。
arrange(col1, col2, desc(col4))
用于排列数据,但由于数据未在技术上分组,因此 top_n
return 等函数只是整个列表的前 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)