在 R data.table 中获取每组前 k 条记录,其中 k 因组而异

Max*_*nis 1 r data.table

我有两个data.table

  1. k要从中提取顶部的值,每个group.
  2. group到要k为其选择的值的映射group

如何在 R 数据框中按组或在类别内(按组)查找前 N 个值解决了这个问题,当k不因组而异时。我怎样才能做到这一点?这是示例数据和所需的结果:

价值观:

(dt <- data.table(id=1:10,
                  group=c(rep(1, 5), rep(2, 5))))
#     id group
#  1:  1     1
#  2:  2     1
#  3:  3     1
#  4:  4     1
#  5:  5     1
#  6:  6     2
#  7:  7     2
#  8:  8     2
#  9:  9     2
# 10: 10     2
Run Code Online (Sandbox Code Playgroud)

映射groupk

(group.k <- data.table(group=1:2, 
                       k=2:3))
#    group k
# 1:     1 2
# 2:     2 3
Run Code Online (Sandbox Code Playgroud)

Desired result,它应该包括来自group1的前两个记录和来自group2的前三个记录:

(result <- data.table(id=c(1:2, 6:8),
                      group=c(rep(1, 2), rep(2, 3))))
#    id group
# 1:  1     1
# 2:  2     1
# 3:  6     2
# 4:  7     2
# 5:  8     2
Run Code Online (Sandbox Code Playgroud)

应用解决方案来合并返回此错误后,上述联的问题:

merged <- merge(dt, group.k, by="group")
(result <- merged[, head(.SD, k), by=group])
# Error: length(n) == 1L is not TRUE
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 5

我宁愿这样做:

dt[group.k, head(.SD, k), by=.EACHI, on="group"]
Run Code Online (Sandbox Code Playgroud)

因为很清楚看到预期的操作是什么。j可能是.SD[1:k]当然的。在下一个版本中,这两个表达式很可能会(进一步)优化(速度)。

有关直到我们包装这些小插曲的详细说明,请参阅这篇文章by=.EACHI