这是我的data.table的样子:
library(data.table)
dt <- fread('
Year Total Shares Balance
2017 10 1 10
2016 12 2 9
2015 10 2 7
2014 10 3 6
2013 10 NA 3
')**Balance**是我想要的专栏。我试图通过取Total的第一个值10(它也应该是Balance字段的第一个值),然后累加减去Shares中的值,来找出累积减法。所以第二个值是10-1 =9,第三个值是9-2 = 7等等。有一个条件,如果Year是2014,那么除以2后减去Shares值。所以第四个值是7-(2/2)=6,第五个值是6-3=3。我想在最后一行结束计算。
我的尝试是:
dt[, Balance:= ifelse( Year == 2014, cumsum(Total[1]-Shares/2), cumsum(Total[1] - Shares))]发布于 2017-03-16 01:17:24
以下是一种方法。
dt[, Balance2 := Total[1] - cumsum(shift(Shares * (1 - (0.5 *(Year == 2015))), fill=0))]shift用于创建一个lag变量,使用fill=0用0填充第一个元素。其他元素计算为返回份额的Shares * (1 - (0.5 *(Year == 2015))),但当返回Years == 2015时除外,在这种情况下返回Shares * 0.5。
它会返回
dt
Year Total Shares Balance Balance2
1: 2017 10 1 10 10
2: 2016 12 2 9 9
3: 2015 10 2 7 7
4: 2014 10 3 6 6
5: 2013 10 NA 3 3发布于 2017-03-16 03:00:05
FWIW,我想提供一个函数式的替代方案,允许在累积差异、索引等方面进行更灵活的计算。我还使用read.table读取数据。
dt <- read.table(header=TRUE, text='
Year Total Shares Balance
2017 10 1 10
2016 12 2 9
2015 10 2 7
2014 10 3 6
2013 10 NA 3
')
makeNewBalance <- function(dt) {
output <- NULL
for (i in 1:nrow(dt)) {
if (i==1) {
output[i] <- dt$Total[i]
} else {
output[i] <- output[i-1] - as.integer(ifelse(dt$Year[i]==2014,
dt$Shares[i-1]/2,
dt$Shares[i-1]))
}
}
return(output)
}
dt$NewBalance <- makeNewBalance(dt),它还返回
> dt
Year Total Shares Balance NewBalance
1 2017 10 1 10 10
2 2016 12 2 9 9
3 2015 10 2 7 7
4 2014 10 3 6 6
5 2013 10 NA 3 3https://stackoverflow.com/questions/42816288
复制相似问题