我有两个data.table
s:
k
中提取最高group
的值。group
到k
值的映射,以便为group
选择。k
不按群组变化时,how to find the top N values by group or within category (groupwise) in an R data.frame会解决此问题。我怎样才能做到这一点?这是样本数据和期望的结果:
值:
(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
从group
到k
的映射:
(group.k <- data.table(group=1:2,
k=2:3))
# group k
# 1: 1 2
# 2: 2 3
所需result
,其中应包括group
1中的前两个记录和group
2中的前三个记录:
(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
合并后将solution应用于上述链接的问题会返回以下错误:
merged <- merge(dt, group.k, by="group")
(result <- merged[, head(.SD, k), by=group])
# Error: length(n) == 1L is not TRUE
答案 0 :(得分:4)
我宁愿这样做:
dt[group.k, head(.SD, k), by=.EACHI, on="group"]
因为很清楚看到预期的操作是什么。 j
当然可以是.SD[1:k]
。在下一个版本中,这两个表达式很可能(进一步)优化(速度)。
有关by=.EACHI
的详细说明,请参阅this post,直到我们将这些小插图包装好。
答案 1 :(得分:1)
在k
合并group
之后,可以采用与https://stackoverflow.com/a/14800271/1840471解决方案类似的方法,只需unique
即可避免length(n)
错误:
merged <- merge(dt, group.k, by="group")
(result <- merged[, head(.SD, unique(k)), by=group])
# group id k
# 1: 1 1 2
# 2: 1 2 2
# 3: 2 6 3
# 4: 2 7 3
# 5: 2 8 3