代码之家  ›  专栏  ›  技术社区  ›  ThePlowKing

R中两列上矩阵/xts对象的累积和

  •  0
  • ThePlowKing  · 技术社区  · 8 年前

    我昨天发布了一个关于累计金额的问题,但由于这一个有点不同,我认为我应该创建一个新的主题(我还确保适当搜索论坛,以防可能使用类似的内容)。

    我想计算特定ID(ID)库存的累积总和 100

    a <- c(20,50,30,50,10, 40)
    b <- c("100", "200", "300", "100", "100", "100")
    c <- c("200", "100", "100", "200", "200", "100")
    matrix1 <- cbind(a,b,c)
    dim(matrix1) <- c(6,3)
    colnames(matrix1) <- c("inventory", "buyer", "seller")
    

    当您将此代码放入R时,应显示以下格式的矩阵:

    inventory | buyer   | seller
    20        |  100    | 200
    50        |  200    | 100
    30        |  300    | 100
    50        |  100    | 200
    10        |  100    | 200
    40        |  100    | 100
    

    (注意,由于这是一个 xts 对象的左边应该有一个时间戳 inventory 专栏,但我把它删掉了,因为它不相关)。

    现在,有三个ID: , 200 300 他们互相买卖,结果是 buyer 获得每行的库存和 seller 丢失库存。此外,如果两个中的ID相同 列,则库存保持不变。对于我的特殊问题,我只关心ID的累积库存 100 我不在乎 300 .

    累积库存为20,位于第二行 100 100 100 列中,库存与第五列相同,因此再次为0。

    c(20, -30, -60, -10, 0, 0)

    此外,由于这是一个 xts公司 对象,我不确定这是否会改变任何事情(虽然我高度怀疑它确实会改变任何事情,但我唯一忽略的是,实际上矩阵左侧应该有一个时间戳列,但我排除了它,因为它与问题无关)。

    有没有一种基于两列和单个ID计算累积和的好方法?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Evan Friedland    8 年前

    我对其进行了编辑,以处理任何一个数据。框架或矩阵。如果这对你有效,请告诉我。

    cum.inv <- function(ID, data){
      stopifnot(colnames(data) %in% c("inventory", "buyer", "seller"))
      cumsum(ifelse(data[,"buyer"] == data[,"seller"], 0, 
                    ifelse(data[,"buyer"] == ID, as.numeric(matrix1[,"inventory"]), 
                           ifelse(data[,"seller"] == ID, -as.numeric(matrix1[,"inventory"]), 0))))
    }
    cum.inv(100, matrix1)
    #[1]  20 -30 -60 -10   0   0
    
    cum.inv(200, matrix1)
    #[1] -20  30  30 -20 -30 -30
    
    cum.inv(300, matrix1)
    #[1]  0  0 30 30 30 30