R数据表两阶段查找

R数据表两阶段查找,r,data.table,R,Data.table,示例数据: set.seed(33) a = data.table(id = c(rep(1,5), rep(3,5)), date = rep(seq(Sys.Date()-4, Sys.Date(), by = "day"), 2), value = c(sample(seq(11,43,0.1), 5), sample(seq(201,273,0.1), 5))) b = data.tabl

示例数据:

set.seed(33)    
a = data.table(id = c(rep(1,5), rep(3,5)),
                  date = rep(seq(Sys.Date()-4, Sys.Date(), by = "day"), 2),
                  value = c(sample(seq(11,43,0.1), 5), sample(seq(201,273,0.1), 5)))
b = data.table(group = c(1, 1, 2),
                   id = c(1, 3,  5))
c = data.table(date=seq(Sys.Date()-4, Sys.Date(), by = "day"),
                   group = 1)

我想将
表a
加入
表b
并将临时结果加入
表c

另一种解释是,对于
表c
中的每组,我希望使用
表a
中的每日价格,将相应
表b
中公司(id)的所有每日价值相加

例如

表c
第1行是2020年8月20日的第1组,因此对应于
表b
中的公司id的1和3,其对应值为22.8和242.2

因此
表c
第1行的值应该是
22.8+242.2=265.0

这里有一个选项:

a[, group := b[.SD, on = "id", group]]
c <- a[c, on = c("group", "date"), sum(value), by = .EACHI]
#    group       date    V1
# 1:     1 2020-08-20 272.5
# 2:     1 2020-08-21 261.1
# 3:     1 2020-08-22 312.2
# 4:     1 2020-08-23 254.0
# 5:     1 2020-08-24 227.4
仅通过引用更新
c

a[, group := b[.SD, on = "id", group]]
c[, V1 := a[.SD, on = c("group", "date"), sum(value), by = .EACHI]$V1]
可复制的数据(尽管并非真正因为使用了
Sys.Date()
):

这里有一个选择:

a[, group := b[.SD, on = "id", group]]
c <- a[c, on = c("group", "date"), sum(value), by = .EACHI]
#    group       date    V1
# 1:     1 2020-08-20 272.5
# 2:     1 2020-08-21 261.1
# 3:     1 2020-08-22 312.2
# 4:     1 2020-08-23 254.0
# 5:     1 2020-08-24 227.4
仅通过引用更新
c

a[, group := b[.SD, on = "id", group]]
c[, V1 := a[.SD, on = c("group", "date"), sum(value), by = .EACHI]$V1]
可复制的数据(尽管并非真正因为使用了
Sys.Date()
):


太好了,谢谢。我想把这个列添加到
c
yes!!有没有办法在查询中命名
c
中的列?@Laurence_jj,是的,就像任何常规数据一样。表操作,将
sum(value)
替换为
(xyz=sum(value))
非常感谢,是否可以修改
c
,而不需要用结果替换整个表?@Laurence_jj使用一个这样的解决方案进行了更新。顺便说一句,命名有两种不好的做法:(1)在R
c
中命名任何东西已经为函数保留了名称,(2)使用
Sys.Date()
会破坏再现性。非常感谢。我想把这个列添加到
c
yes!!有没有办法在查询中命名
c
中的列?@Laurence_jj,是的,就像任何常规数据一样。表操作,将
sum(value)
替换为
(xyz=sum(value))
非常感谢,是否可以修改
c
,而不需要用结果替换整个表?@Laurence_jj使用一个这样的解决方案进行了更新。顺便说一句,命名有两种不好的做法:(1)在R
c
name中命名任何东西都已经为函数保留了名称,(2)使用
Sys.Date()
会破坏再现性。
set.seed(33)
a = data.table(id = c(rep(1,5), rep(3,5)),
              date = rep(seq(Sys.Date()-4, Sys.Date(), by = "day"), 2),
              value = c(sample(seq(11,43,0.1), 5), sample(seq(201,273,0.1), 5)))
b = data.table(group = c(1, 1, 2),
               id = c(1, 3,  5))
c = data.table(date=seq(Sys.Date()-4, Sys.Date(), by = "day"),
               group = 1)