首页 > 解决方案 > 按组和条件 data.table 编辑

问题描述

如何编辑每个组的最大值?看起来我在这里按最大“日期”进行子集,而不是每年的最大日期:

dt = data.table(date = c('2001-01-01', '2001-01-02', '2002-01-01', '2002-01-02'), value = 1, year = c(2001, 2001, 2002, 2002))
dt[date == max(date), value := 2, by =. (year)]
#         date value year
# 1: 2001-01-01     1 2001
# 2: 2001-01-02     1 2001
# 3: 2002-01-01     1 2002
# 4: 2002-01-02     2 2002

而不是预期的:

 #         date value year
    # 1: 2001-01-01     1 2001
    # 2: 2001-01-02     2 2001
    # 3: 2002-01-01     1 2002
    # 4: 2002-01-02     2 2002

标签: rdata.table

解决方案


因此,data.table 的主要“参数”是 part ij和 by,通常i并且j仅由它们的位置引用:DT[i, j, by]。您的代码不起作用,因为i(过滤器)在 by 之前进行了评估。因此,只有 j 受 by 参数的影响。

一种可能的解决方案:

dt[, value := fifelse(date == max(date), 2, 1), by = year]

通过考虑 i、j 等术语,如果顺序不寻常,您可以始终使用参数的名称。on例如,当您使用和时会派上用场.SDcols

dt[i = 1:4, j = value := fifelse(date == max(date), 2, 1), by = year]
dt[by = year, j = value := fifelse(date == max(date), 2, 1), i = 1:4]

推荐阅读