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)在Rc
中命名任何东西已经为函数保留了名称,(2)使用Sys.Date()
会破坏再现性。非常感谢。我想把这个列添加到c
yes!!有没有办法在查询中命名c
中的列?@Laurence_jj,是的,就像任何常规数据一样。表操作,将sum(value)
替换为(xyz=sum(value))
非常感谢,是否可以修改c
,而不需要用结果替换整个表?@Laurence_jj使用一个这样的解决方案进行了更新。顺便说一句,命名有两种不好的做法:(1)在Rc
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)