如何使用dplyr获得每组的顶级案例?
我有一个包含3列的数据表:ID、Type和Count。对于每个ID,我希望得到该ID中计数最多的2个类型,并将结果平铺成一行。例如,如果我的数据表如下所示:如何使用dplyr获得每组的顶级案例?,r,dplyr,R,Dplyr,我有一个包含3列的数据表:ID、Type和Count。对于每个ID,我希望得到该ID中计数最多的2个类型,并将结果平铺成一行。例如,如果我的数据表如下所示: ID Type Count A 1 8 B 1 3 A 2 5 A 3 2 B 2 1 B 3 4 ID Top1Type Top1TypeCount Top2Type Top2TypeCount A 1
ID Type Count
A 1 8
B 1 3
A 2 5
A 3 2
B 2 1
B 3 4
ID Top1Type Top1TypeCount Top2Type Top2TypeCount
A 1 8 2 5
B 3 4 1 3
然后我希望我的输出是两行,如下所示:
ID Type Count
A 1 8
B 1 3
A 2 5
A 3 2
B 2 1
B 3 4
ID Top1Type Top1TypeCount Top2Type Top2TypeCount
A 1 8 2 5
B 3 4 1 3
有人能告诉我如何使用R中的dplyr库来实现这一点吗?非常感谢。最好将数据保存在长/整齐的格式中。要实现这一点,您可以使用:
df1 %>% group_by(ID) %>% top_n(2, Count) %>% arrange(ID)
其中:
ID Type Count
(fctr) (int) (int)
1 A 1 8
2 A 2 5
3 B 1 3
4 B 3 4
当有联系时,可以使用“切片”为每组选择相等数量的观察值:
# some example data
df2 <- structure(list(ID = structure(c(1L, 2L, 1L, 1L, 2L, 2L), .Label = c("A", "B"), class = "factor"),
Type = c(1L, 1L, 2L, 3L, 2L, 3L),
Count = c(8L, 3L, 8L, 8L, 1L, 4L)),
.Names = c("ID", "Type", "Count"), class = "data.frame", row.names = c(NA, -6L))
给出:
ID Type Count
(fctr) (int) (int)
1 A 1 8
2 A 2 8
3 A 3 8
4 B 1 3
5 B 3 4
ID Type Count
(fctr) (int) (int)
1 A 1 8
2 A 2 8
3 B 1 3
4 B 3 4
使用slice()
:
给出:
ID Type Count
(fctr) (int) (int)
1 A 1 8
2 A 2 8
3 A 3 8
4 B 1 3
5 B 3 4
ID Type Count
(fctr) (int) (int)
1 A 1 8
2 A 2 8
3 B 1 3
4 B 3 4
使用arrange
可以确定案例的顺序,从而确定由slice
选择的案例。以下是:
df2 %>% group_by(ID) %>% top_n(2, Count) %>% arrange(ID, -Type) %>% slice(1:2)
给出以下结果:
ID Type Count
(fctr) (int) (int)
1 A 3 8
2 A 2 8
3 B 3 4
4 B 1 3
使用
data.table
,我们将“data.frame”转换为“data.table”(setDT(df1)
),按“ID”分组,我们order
按降序排列“Count”,将前两行(head(.SD,2)
)。然后,我们创建一个按“ID”分组的序列列(“N”),并从“long”到“wide”dcast
。data.table
dcast
可以包含多个value.var
列
library(data.table)#v1.9.6+
DT <- setDT(df1)[order(-Count), head(.SD, 2) , by = ID]
DT[, N:= 1:.N, by = ID]
dcast(DT, ID~paste0('Top', N),
value.var=c('Type', 'Count'), fill = 0)
# ID Type_Top1 Type_Top2 Count_Top1 Count_Top2
#1: A 1 2 8 5
#2: B 3 1 4 3
library(data.table)#v1.9.6+
DT使用top\u n
选择topn
案例感谢您的帮助。感谢您的帮助akrun,它可以工作感谢Jaap提供的解决方案。通过使用top_n函数,如果计数中有ties,那么将返回所有ties,有没有办法只返回两种类型?@Carter我添加了一个示例,说明如何使用slice()
,该示例可用于为每个组选择相同数量的案例