我有一个编码问题,我认为应该很简单。我创建了一个简化的数据集:
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
我想创建一个变量,该变量是每个银行 Type =“Liab”时的金额总和。所以这没问题:
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
但我希望所有行都有这个值,即使 Type =='Ass' 时也是如此。据我了解,由于 DT[Type=='Liab',..]
限制,我现在得到 NA。是否有一种巧妙的编码方法来获取所有行的 SumLiab 值? (因此当前 SumLiab 的 NA 的 row1 的值为 500)
谢谢! 蒂姆
最佳答案
当我们在“i”中使用Type=='Liab'
时,它只会将值插入到由“i”索引的行中。我们可以根据“j”中的 Type=='Liab'
对“Amount”进行子集化,并将其分配 (:=
) 为新变量。
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
关于r - r data.table 中所有行的条件总和输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471432/