首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件累积减法

条件累积减法
EN

Stack Overflow用户
提问于 2017-03-16 01:04:36
回答 2查看 324关注 0票数 1

这是我的data.table的样子:

代码语言:javascript
复制
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。我想在最后一行结束计算。

我的尝试是:

代码语言:javascript
复制
dt[, Balance:= ifelse( Year == 2014, cumsum(Total[1]-Shares/2), cumsum(Total[1] - Shares))]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-16 01:17:24

以下是一种方法。

代码语言:javascript
复制
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

它会返回

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-03-16 03:00:05

FWIW,我想提供一个函数式的替代方案,允许在累积差异、索引等方面进行更灵活的计算。我还使用read.table读取数据。

代码语言:javascript
复制
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)

,它还返回

代码语言:javascript
复制
> 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          3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42816288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档