2015-07-17 3 views
1

У меня проблема с кодированием, что, по моему мнению, должно быть очень простым. Я создал упрощенный набор данных:Условная сумма с выходом для всех строк в r data.table

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 

Но я хочу это значение для всех строк, даже если тип == «Ass». Я понимаю, что теперь я получаю NA из-за ограничения DT[Type=='Liab',..]. Есть ли умный способ кодирования для получения значения SumLiab для всех строк? (Итак, строка1, которая в настоящее время является NA для SumLiab, получает значение 500)

Спасибо! Tim

ответ

1

Когда мы используем Type=='Liab' в 'i', он вставляет значения только в строки, индексированные 'i'. Мы можем подмножить «Сумма» на основе 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 
+1

Точно, что я искал, спасибо! По-видимому, он примет это как ответ, когда возникнет ограничение времени. –

Смежные вопросы