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