R 使用“lappy”和“by”通过引用修改data.table会为分组列创建重复的行

R 使用“lappy”和“by”通过引用修改data.table会为分组列创建重复的行,r,data.table,lapply,R,Data.table,Lapply,以前可能有人问过这个问题,我已经仔细看过了,但我似乎找不到答案。因此,我也建议修改我的标题,所以如果有人发布一个链接到答案,我会很好 我下面有一个MWE。我试图在每个月的第天按列val分组。据我所知,在下面代码中的场景1中,由于我没有通过:=,将lappy的值分配给任何新列,因此会打印data.table 但是,在场景2中,当我通过引用使用:=分配新列变量时,新列是使用正确的值创建的,但该值在一天中每小时重复一次,而我只需要每日值 场景3还提供了所需的结果,但需要创建新的data.table 我

以前可能有人问过这个问题,我已经仔细看过了,但我似乎找不到答案。因此,我也建议修改我的标题,所以如果有人发布一个链接到答案,我会很好

我下面有一个MWE。我试图在每个月的第天按列val分组。据我所知,在下面代码中的场景1中,由于我没有通过:=,将lappy的值分配给任何新列,因此会打印data.table

但是,在场景2中,当我通过引用使用:=分配新列变量时,新列是使用正确的值创建的,但该值在一天中每小时重复一次,而我只需要每日值

场景3还提供了所需的结果,但需要创建新的data.table

我也不会想到set,因为值是按行迭代的,我需要对某些列进行分组

谢谢你的帮助

library(data.table)
library(magrittr)

set.seed(123)

# create data.table to group by
dt <- data.table(year = rep(2018, times = 24 * 31),
                 month = rep(1, times = 24 * 31),
                 day = rep(1:31, each = 24),
                 hour = rep(0:23, times = 31)) %>% 
  .[, val := sample(100, size = nrow(dt), replace = TRUE)]


# SCENARIO 1
# creates desired dataframe but only prints it, doesn't modify dt by reference (because it is missing `:=`)
dt[, lapply(.SD,
            sum),
   .SDcols = "val",
   by = .(year,
          month,
          day)]


# Scenario 2
# creates desired val column, but creates duplicate val values for all rows of original grouping by data.table
dt[, val := lapply(.SD,
                   sum),
   .SDcols = "val",
   by = .(year,
          month,
          day)]


# SCENARIO 3
# this also works, but requires creating a new data.table
new_dt <- dt[, lapply(.SD,
                      sum),
             .SDcols = "val",
             by = .(year,
                    month,
                    day)]

我认为在创建新的data.table对象时没有任何问题,您可以使用相同的名称进行重写

     dt <- dt[, lapply(.SD,
                      sum),
             .SDcols = "val",
             by = .(year,
                    month,
                    day)]

现在,您无法更改data.table中的行数,而无需像DTI一样重写。感谢问题链接。我似乎在数据表上落后了几年。重复行似乎是使用以下参数通过引用对val列进行分组和修改的结果:=。有没有办法将该操作包括在内,使用lappy将其包含到data.table链中?我可以创建新的data.table,但是如果我可以链接它,并且data.table的行会根据变量分组进行修改,那么流程会更好。它们不会重复。它们与初始data.table中的行相同。您可以使用DTP删除它。您是对的,它们不会重复。lapply为分组变量中的所有行创建具有相同值的新列val。我将继续阅读,现在只分配给一个新的变量…我现在看到我所追求的是不可能的。我在参考语义文档中重新创建了这个示例,得到了与我在自己的分析中所经历的相同的结果。这一点,再加上@Vladimir Volokhonsky提供的链接证实了这一点。