首页 > 解决方案 > 对 2 个变量进行分组总和并从总数中减去

问题描述

我有data.table以下形式:-

library(data.table)
b <- data.table(Code_Nm = c(rep("a", 3), rep("b", 3), rep("d", 3)),
            Year = rep(2011:2013, 3), total = rep(10, 9),
            a = c(rep(0, 3), 1:6), b = c(7:9, 0, 0, 0, 10:12), d = c(13:18, 0, 0, 0))
b

#   Code_Nm Year total a  b  d
#1:       a 2011    10 0  7 13
#2:       a 2012    10 0  8 14
#3:       a 2013    10 0  9 15
#4:       b 2011    10 1  0 16
#5:       b 2012    10 2  0 17
#6:       b 2013    10 3  0 18
#7:       d 2011    10 4 10  0
#8:       d 2012    10 5 11  0
#9:       d 2013    10 6 12  0

我想得到一个data.table这样的最后一列命名actual的值等于total减去每个的年度组的总和Code_Nm。即a2011它是除列之外的所有值的10负总和。这等于。2011a10 - (1+4)

a与in类似2012,它是除column 之外10的所有值的负总和。这等于。2012a10 - (2+5)

类似的是b2011它是除列之外的所有值的10负总和。这等于。对于in ,它是除column 之外的所有值的负总和。这等于。2011b10 - (7+10)b2012102012b10 - (8+11)

d也是如此。

最终结果如下data.table:-

b <- data.table(Code_Nm = c(rep("a", 3), rep("b", 3), rep("d", 3)),
            Year = rep(2011:2013, 3), total = rep(10, 9),
            a = c(rep(0, 3), 1:6), b = c(7:9, 0, 0, 0, 10:12), d = c(13:18, 0, 0, 0),
            actual = c(5, 3, 1, -7, -9, -11, -19, -21, -23))
b

#   Code_Nm Year total a  b  d actual
#1:       a 2011    10 0  7 13      5
#2:       a 2012    10 0  8 14      3
#3:       a 2013    10 0  9 15      1
#4:       b 2011    10 1  0 16     -7
#5:       b 2012    10 2  0 17     -9
#6:       b 2013    10 3  0 18    -11
#7:       d 2011    10 4 10  0    -19
#8:       d 2012    10 5 11  0    -21
#9:       d 2013    10 6 12  0    -23

请使用data.table.

提前致谢。

标签: rdata.table

解决方案


在指定感兴趣的列并从“总计”中减去之后,我们可以rowSums在 data.table ( ) 的子集上使用.SD.SDcols

b[, actual := total  - rowSums(.SD), .SDcols = a:d]

-输出

b
#    Code_Nm Year total a b d actual
#1:       a 2011    10 0 2 3      5
#2:       a 2012    10 0 3 4      3
#3:       a 2013    10 0 4 5      1
#4:       b 2011    10 1 0 6      3
#5:       b 2012    10 2 0 7      1
#6:       b 2013    10 3 0 8     -1
#7:       d 2011    10 4 5 0      1
#8:       d 2012    10 5 6 0     -1
#9:       d 2013    10 6 7 0     -3

推荐阅读