R

时间:2017-07-10 22:35:20

标签: r matrix xts cumulative-sum

我昨天发布了一个关于累积金额的问题,但由于这个有点不同,我认为我应该创建一个新主题(我也确保正确搜索论坛以防万一可以使用类似的东西)。

我想根据matrix / xts对象的两列中的信息计算特定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:100200300,它们各自相互买卖,其中发生的是buyer获取每行的库存,seller丢失库存。此外,如果buyerseller列中同一ID,则库存保持不变。对于我的特定问题,我只关心ID 100的累积广告资源,而我并不关心200300的累积广告资源。

对于上面的示例,这意味着第一行100的累积广告资源为20,而第二行100的累积广告资源为-30。同样,对于第三行,100的累积广告资源为-60,第四行的累积广告资源为-10,而第五行100的累积广告资源为0。对于第六行,由于100buyer列中都有seller,因此库存与第五列相同,因此它再次为0.

因此,我希望获得以c(20, -30, -60, -10, 0, 0)

给出的累积清单向量

此外,由于这是一个xts对象,我不确定这是否会改变任何东西(尽管我高度怀疑它确实改变了什么,我唯一遗漏的是事实上应该有一个时间戳矩阵左侧的列,但我将其排除,因为它与问题无关。)

是否有一种基于两列并基于个人ID计算累积金额的好方法?

1 个答案:

答案 0 :(得分:1)

我已编辑它以处理data.frame或矩阵。如果这对您有用,请告诉我。

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