有条件的总和与输出r中data.table所有行(Conditional sum with outp

2019-10-23 23:21发布

我有一个编码问题,我认为应该是很容易的。 我创建了一个简单的数据集:

DT <- data.table(Bank=rep(c("a","b","c"),4),
                 Type=rep(c("Ass","Liab"),6),
                 Amount=c(100,200,300,400,200,300,400,500,200,100,300,100))
# Bank Type Amount SumLiab
# 1:    a  Ass    100      NA
# 2:    b Liab    200     700
# 3:    c  Ass    300      NA
# 4:    a Liab    400     500
# 5:    b  Ass    200      NA
# 6:    c Liab    300     400
# 7:    a  Ass    400      NA
# 8:    b Liab    500     700
# 9:    c  Ass    200      NA
# 10:    a Liab    100     500
# 11:    b  Ass    300      NA
# 12:    c Liab    100     400

我想创建一个变量,是量的总和时,类型=每个银行“牌照上诉委员会”。 因此,这是没有问题的:

DT[Type=='Liab',SumLiab:=sum(Amount),by=Bank]
# Bank Type Amount SumLiab
# 1:    a  Ass    100      NA
# 2:    b Liab    200     700
# 3:    c  Ass    300      NA
# 4:    a Liab    400     500
# 5:    b  Ass    200      NA
# 6:    c Liab    300     400
# 7:    a  Ass    400      NA
# 8:    b Liab    500     700
# 9:    c  Ass    200      NA
# 10:    a Liab    100     500
# 11:    b  Ass    300      NA
# 12:    c Liab    100     400

但我想对所有行此值,即使类型==“屁股”。 据我所知,我现在得到NA由于DT[Type=='Liab',..]限制。 有编码以获取所有行的值SumLiab的一个聪明的办法? (所以ROW1,目前是NA为SumLiab得到值500)

谢谢! 蒂姆

Answer 1:

当我们使用Type=='Liab'在“我”,它插入值仅通过“我”收录的行。 我们可以根据子集上的“金额” Type=='Liab'在“J”,并指定( := ),它是新的变量。

 DT[, SumLiab:= sum(Amount[Type=='Liab']), by =Bank]
 DT
 #   Bank Type Amount SumLiab
 #1:    a  Ass    100     500
 #2:    b Liab    200     700
 #3:    c  Ass    300     400
 #4:    a Liab    400     500
 #5:    b  Ass    200     700
 #6:    c Liab    300     400
 #7:    a  Ass    400     500
 #8:    b Liab    500     700
 #9:    c  Ass    200     400
 #10:   a Liab    100     500
 #11:   b  Ass    300     700
 #12:   c Liab    100     400


Answer 2:

不,我不认为这是正确的。

你可以试试这个:

DT[ SumLiab:=sum(Amount), by = list(Bank, Type)][]

代码的输出:



文章来源: Conditional sum with output for all rows in r data.table