首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在两张桌子上求和?

如何在两张桌子上求和?
EN

Stack Overflow用户
提问于 2017-01-16 19:50:25
回答 1查看 856关注 0票数 13

我有两张桌子需要做个总结。表1载有时间周期,即年底的年度和季度(即4812等)。表2载列了本年度的季度367等交易。

我需要表3总结所有的交易在一年中,以便我得到累积的立场,在年底。

下面是一些示例代码来解释数据的外观和输出应该是什么样子:

代码语言:javascript
运行
复制
library(data.table)

x1 <- data.table("Name" = "LOB1", "Year" = 2000, 
                 "Quarter" = c(4, 8, 12, 16, 20, 24, 28, 32, 36))
x2 <- data.table("Name" = "LOB1", "Year" = 2000, 
                 "Quarter" = c(3, 6, 7, 9, 11, 14, 16, 20, 24), 
                 "Amount" = c(10000, 15000, -2500, 3500, -6500, 25000, 
                              11000, 9000, 7500))
x3 <- data.table("Name" = "LOB1", "Year" = 2000, 
                 "Quarter" = c(4, 8, 12, 16, 20, 24, 28, 32, 36), 
                 "Amount" = c(10000, 22500, 19500, 55500, 64500, 72000, 
                              72000, 72000, 72000))

我试过mergesummarisefoverlaps,但都搞不清楚。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-16 20:12:40

问得好。基本上,您要做的是加入NameYearQuarter <= Quarter,同时将所有匹配的Amount值相加。这两种方法都可以使用新的非赤道联接(这是在data.table v-1.10.0的最新稳定版本中引入的)和foverlaps (而后者可能是次优)。

非赤道联接:

代码语言:javascript
运行
复制
x2[x1, # for each value in `x1` find all the matching values in `x2`
   .(Amount = sum(Amount)), # Sum all the matching values in `Amount`
   on = .(Name, Year, Quarter <= Quarter), # join conditions
   by = .EACHI] # Do the summing per each match in `i`
#    Name Year Quarter Amount
# 1: LOB1 2000       4  10000
# 2: LOB1 2000       8  22500
# 3: LOB1 2000      12  19500
# 4: LOB1 2000      16  55500
# 5: LOB1 2000      20  64500
# 6: LOB1 2000      24  72000
# 7: LOB1 2000      28  72000
# 8: LOB1 2000      32  72000
# 9: LOB1 2000      36  72000

另外,您可以轻松地将Amount添加到x1中(由@Frank提出):

代码语言:javascript
运行
复制
x1[, Amount := 
  x2[x1, sum(x.Amount), on = .(Name, Year, Quarter <= Quarter), by = .EACHI]$V1
]

如果不仅仅是表中的三个联接列,这可能更方便。

foverlaps:

您提到了foverlaps,因此理论上也可以使用此函数实现相同的功能。虽然我担心你会很容易地从记忆中消失。使用foverlaps,您将需要创建一个巨大的表,其中x2中的每个值都多次连接到x1中的每个值,并将所有内容存储在内存中。

代码语言:javascript
运行
复制
x1[, Start := 0] # Make sure that we always join starting from Q0
x2[, Start := Quarter] # In x2 we want to join all possible rows each time 
setkey(x2, Name, Year, Start, Quarter) # set keys
## Make a huge cartesian join by overlaps and then aggregate
foverlaps(x1, x2)[, .(Amount = sum(Amount)), by = .(Name, Year, Quarter = i.Quarter)]
#    Name Year Quarter Amount
# 1: LOB1 2000       4  10000
# 2: LOB1 2000       8  22500
# 3: LOB1 2000      12  19500
# 4: LOB1 2000      16  55500
# 5: LOB1 2000      20  64500
# 6: LOB1 2000      24  72000
# 7: LOB1 2000      28  72000
# 8: LOB1 2000      32  72000
# 9: LOB1 2000      36  72000
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41684012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档