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



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

我想根据矩阵/xts 对象两列中的信息计算特定 ID 清单的累积总和(以下示例中的 ID100(。为了便于使用,我在下面添加了一个示例代码:

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失去库存。此外,如果"buyer"和"seller"列中具有相同的 ID,则库存保持不变。对于我的特定问题,我只关心ID100的累积库存,而不关心200300的累积库存。

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

因此,我想获得一个累积库存向量,如下所示c(20, -30, -60, -10, 0, 0)

另外,由于这是一个xts对象,我不确定这是否会改变任何东西(尽管我非常怀疑它确实改变了任何东西,但我唯一省略的是矩阵左侧实际上应该有一个时间戳列,但我排除了它,因为它与问题无关(。

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

我已经编辑了它以处理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

最新更新