使用 data.table 的嵌套分组中的前 n 个
Top n in nested grouping using data.table
目标:按季度和名称分组我想按计数获得前 n 个名称(请参见下面的示例)。因此,top 1 所需的输出(对于下面的示例)将是:
2019 Q1 Klaus 2
2019 Q2 Karl 3
因为这只是一个玩具示例,所以我还希望按每个季度的计数和名称获得前 4、5 等。
你有什么好的想法如何用 data.table
实现这个(请不要 dplyr
)。非常感谢!
library(data.table)
dt <- data.table(x = c("2019 Q1", "2019 Q1", "2019 Q1", "2019 Q2", "2019 Q2", "2019 Q2", "2019 Q2"),
y = c("Klaus", "Gustav", "Klaus", "Karl", "Karl", "Karl", "Stefan"))
# Structure of dt
# x y
# 1: 2019 Q1 Klaus
# 2: 2019 Q1 Gustav
# 3: 2019 Q1 Klaus
# 4: 2019 Q2 Karl
# 5: 2019 Q2 Karl
# 6: 2019 Q2 Karl
# 7: 2019 Q2 Stefan
dt[, .N, by = .(x, y)]
# Output:
# x y N
# 1: 2019 Q1 Klaus 2
# 2: 2019 Q1 Gustav 1
# 3: 2019 Q2 Karl 3
# 4: 2019 Q2 Stefan 1
您可以先计算每个名称和季度的 N,然后排序 data.table,然后每个季度选择前 n 行:
dt[, .N, by = .(x, y)][order(-N), head(.SD, 1), by = x]
这是使用 aggregate
的基本 R 解决方案
> aggregate(y~x,dt,function(v) as.matrix(head(data.frame(sort(table(v),decreasing = TRUE)),1)))
x y.1 y.2
1 2019 Q1 Klaus 2
2 2019 Q2 Karl 3
这是另一种 data.table
方法,与 Gilean 的回答几乎相同,但没有 head()
。
dt[, .N, by = .(x,y) ][ order(-N), .SD[1:1], by = x ]
# x y N
# 1: 2019 Q2 Karl 3
# 2: 2019 Q1 Klaus 2
data.table
的另一个解决方案:
dt[, .N, by = .(x, y)][, .SD[N==max(N)][1], x]
或更好
dt[, .N, by = .(x, y)][, head(.SD[N==max(N)], 1), x]
目标:按季度和名称分组我想按计数获得前 n 个名称(请参见下面的示例)。因此,top 1 所需的输出(对于下面的示例)将是:
2019 Q1 Klaus 2
2019 Q2 Karl 3
因为这只是一个玩具示例,所以我还希望按每个季度的计数和名称获得前 4、5 等。
你有什么好的想法如何用 data.table
实现这个(请不要 dplyr
)。非常感谢!
library(data.table)
dt <- data.table(x = c("2019 Q1", "2019 Q1", "2019 Q1", "2019 Q2", "2019 Q2", "2019 Q2", "2019 Q2"),
y = c("Klaus", "Gustav", "Klaus", "Karl", "Karl", "Karl", "Stefan"))
# Structure of dt
# x y
# 1: 2019 Q1 Klaus
# 2: 2019 Q1 Gustav
# 3: 2019 Q1 Klaus
# 4: 2019 Q2 Karl
# 5: 2019 Q2 Karl
# 6: 2019 Q2 Karl
# 7: 2019 Q2 Stefan
dt[, .N, by = .(x, y)]
# Output:
# x y N
# 1: 2019 Q1 Klaus 2
# 2: 2019 Q1 Gustav 1
# 3: 2019 Q2 Karl 3
# 4: 2019 Q2 Stefan 1
您可以先计算每个名称和季度的 N,然后排序 data.table,然后每个季度选择前 n 行:
dt[, .N, by = .(x, y)][order(-N), head(.SD, 1), by = x]
这是使用 aggregate
> aggregate(y~x,dt,function(v) as.matrix(head(data.frame(sort(table(v),decreasing = TRUE)),1)))
x y.1 y.2
1 2019 Q1 Klaus 2
2 2019 Q2 Karl 3
这是另一种 data.table
方法,与 Gilean 的回答几乎相同,但没有 head()
。
dt[, .N, by = .(x,y) ][ order(-N), .SD[1:1], by = x ]
# x y N
# 1: 2019 Q2 Karl 3
# 2: 2019 Q1 Klaus 2
data.table
的另一个解决方案:
dt[, .N, by = .(x, y)][, .SD[N==max(N)][1], x]
或更好
dt[, .N, by = .(x, y)][, head(.SD[N==max(N)], 1), x]