我有两个data.table:
k要从中提取顶部的值,每个group.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)
映射group到k:
(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)
我宁愿这样做:
dt[group.k, head(.SD, k), by=.EACHI, on="group"]
Run Code Online (Sandbox Code Playgroud)
因为很清楚看到预期的操作是什么。j可能是.SD[1:k]当然的。在下一个版本中,这两个表达式很可能会(进一步)优化(速度)。
有关直到我们包装这些小插曲的详细说明,请参阅这篇文章by=.EACHI。