在R data.table

时间:2015-11-29 22:19:03

标签: r data.table

我有两个data.table s:

  1. k中提取最高group的值。
  2. groupk值的映射,以便为group选择。
  3. 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
    

    groupk的映射:

    (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
    

2 个答案:

答案 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