2017-01-16 6 views
13

私はsumifを実行するために必要な2つのテーブルを持っています。表1は、期間、すなわち年末の年および四半期(すなわち、4,8,12など)を含む。表2は、2つのテーブルを合計する方法は?

など、四半期3で今年中にトランザクションが含ま67私は年度末の累積位置を得るように、今年中にすべての取引を合計するには、表3を必要としています。

ここでデータがどのように見えるし、出力がどのように見えるか何かを説明するためにいくつかのサンプルコードです:

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を試してみたが、かなりそれを把握することはできませんが。

答えて

11

良い質問。基本的にはNameYearQuarter <= Quarterに参加し、すべての一致したAmountの値を合計することです。これは、新しい非等結合(最新の安定版data.table v-1.10.0で導入されたもの)とfoverlaps(後者はおそらく最適ではないものの)を使用して両方可能です。

Non-サイドノートとして

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 

を、あなたは簡単に(@Frankによって提案された)x1に所定の位置にAmountを追加することができます:エクイが参加し

x1[, Amount := 
    x2[x1, sum(x.Amount), on = .(Name, Year, Quarter <= Quarter), by = .EACHI]$V1 
] 

これは、そのテーブルに3つ以上の結合カラムがある場合に便利です。


foverlaps:

理論的にはあなたもこの機能を使用して同じことを達成できるようにするには、foverlapsを述べました。私はあなたが容易に覚悟を抜けてしまうのではないかと心配していますが。 foverlaps使用して、あなたはそんなに

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 
+0

感謝をx2の各値がx1に各値に複数回参加し、巨大なテーブルを作成し、メモリにすべてのものを保存する必要があります - 私はこの作業を得ました。非常に高く評価!私のテーブルの両方が同じ列を持つ必要があるようです。 x2に結果のテーブルx3に含めたくない追加の列が1つあれば、コードは同じですか? – kodfather

+0

'on'引数には、両方のテーブルから必要なカラム名を指定できます。たとえば、 '.on(column1 = column2、column3 = column4)'などです。suasionのLHSは 'x1'からの列であり、方程式のRHSは' x2'からの列です。 –

関連する問題