2015-12-06 122 views
0

要跟蹤現金流的我有許多相互關聯的列在data.table:相關列data.table

  • 「Amount_spent」始終是「平衡」的5%。
  • 「收入」是「Amount_spent」*「價格」
  • 「餘額」是「收入」(從100.00開始)的累計總和。
  • 交易只發生在「天」「一」

我很努力的同時計算出這些相互關聯的列。 例子,因爲我想:

library(data.table) 
Day <- c("a", "c", "b", "a", "b", "a", "b", "c", "a", "a") 
Price <- c(0.6, 0.4, 0.9, -0.3, 0.8, 0.2, 0.3, 0.9, 0.9, -0.7) 
Balance <- c(100.00, 103.00, 103.00, 103.00, 101.46, 101.46, 102.47, 102.47, 102.47, 107.08) 
Amount_spent <- c(5.00, 0.00, 0.00, 5.15, 0.00, 5.07, 0.00, 0.00, 5.12, 5.35) 
Revenue <- c(3.00, 0.00, 0.00, -1.55, 0.00, 1.01, 0.00, 0.00, 4.61, -3.75) 

DT <- data.table(Day, Price, Balance, Amount_spent, Revenue) 
DT 

這是迄今爲止我嘗試:

# set initial balance 
Balance2 <- 100.00 
Day2 <- c("a", "c", "b", "a", "b", "a", "b", "c", "a", "a") 
Price2 <- c(0.6, 0.4, 0.9, -0.3, 0.8, 0.2, 0.3, 0.9, 0.9, -0.7) 
my.try <- data.table(Day2, Price2) 
my.try[, Balance2 := cumsum(Revenue2)] 
my.try[ Day2 == "a", Amount_spent2 := Balance2 * 0.05 ] 
my.try[is.na(Amount_spent2), Amount_spent2 := 0] 
my.try[, Revenue2 := Price2 * Amount_spent2 ] 
my.try 

正如你將看到它失敗的「REVENUE2」列此錯誤消息Error in eval(expr, envir, enclos) : object 'Revenue2' not found是尚未建立。

謝謝

+0

爲什麼不使用'my.try [is.na(Amount_spent2),Amount_spent2:= 0]'而不是使用'<-'對data.table列(壞習慣),同時放棄'na.zero'函數在所有。 – jangorecki

+0

謝謝,我編輯了我的代碼 – user3740289

+0

@jangorecki感謝您的建議。有關如何同時計算列的任何想法? – user3740289

回答

0

你得到它嘗試使用其未在DT在代碼中的那點存在列Revenue2my.try[, Balance2 := cumsum(Revenue2)]後提到的錯誤。

library(data.table) 
Day <- c("a", "c", "b", "a", "b", "a", "b", "c", "a", "a") 
Price <- c(0.6, 0.4, 0.9, -0.3, 0.8, 0.2, 0.3, 0.9, 0.9, -0.7) 
Balance <- c(100.00, 103.00, 103.00, 103.00, 101.46, 101.46, 102.47, 102.47, 102.47, 107.08) 
Amount_spent <- c(5.00, 0.00, 0.00, 5.15, 0.00, 5.07, 0.00, 0.00, 5.12, 5.35) 
Revenue <- c(3.00, 0.00, 0.00, -1.55, 0.00, 1.01, 0.00, 0.00, 4.61, -3.75) 

DT <- data.table(Day, Price, Balance, Amount_spent, Revenue) 

Balance2 <- 100.00 
Day2 <- c("a", "c", "b", "a", "b", "a", "b", "c", "a", "a") 
Price2 <- c(0.6, 0.4, 0.9, -0.3, 0.8, 0.2, 0.3, 0.9, 0.9, -0.7) 
my.try <- data.table(Day2, Price2) 
my.try[, Balance2 := cumsum(Revenue2)] 
#Error in eval(expr, envir, enclos) : object 'Revenue2' not found 
"Revenue2" %in% names(DT) 
#[1] FALSE 

你並沒有產生預期的效果。我不確定你的意思是同時計算列數。如果您想要通過一次引用分配/更新多列,則可以使用`:=()`函數,方法與在data.table的j參數中使用.()list()的方法相同。例如:`:=`(col1=1+2, col2=2+3)
您可以參閱更多更新於Reference semantics vignette

+0

謝謝@jangorecki。我會讀這個小插圖,因爲這是我需要做的; '通過一步引用來分配/更新多列'。我需要每個列同時更新,以便我的data.table與我的第一個示例中的DT相同。 – user3740289

+0

我讀了小插曲,我可以更新我的代碼到'my.try [,c(「Balance2」,「Revenue2」,「Amount_spent2」):= list(cumsum(Revenue2),Price2 * Amount_spent2,Balance2 * 0.05)] '爲了效率,但我仍然遇到同樣的問題。每個值都取決於其他列中值的結果。 – user3740289

+0

@ user3740289您指的是還未評估的「Balance2」列。將它分成兩個步驟,當使用':='進行時,它仍然非常快。你可以連鎖'''data.table調用:'my.try [,c(「Balance2」):= cumsum(Revenue2)] [,c(「Revenue2」,「Amount_spent2」):= list(Price2 * Amount_spent2,平衡2 * 0.05)]' – jangorecki