Matrix/xts 对象在 R 中两列上的累积和
Cumulative Sum of Matrix/xts object on Two Columns in R
我昨天发布了一个关于累积总和的问题,但由于这个问题有点不同,我想我应该创建一个新主题(我还确保正确搜索论坛以防可以使用类似的东西)。
我想根据 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
列的左侧应该有一个时间戳,但我将其遗漏了,因为它不相关)。
现在有3个ID:100
、200
、300
,他们互相买卖,结果是buyer
在每一行获得库存,而 seller
失去库存。此外,如果相同的 ID 在 buyer
和 seller
列中,则库存保持不变。对于我的特定问题,我只关心ID 100
的累积库存,而不关心200
和300
的累积库存。
对于上面的示例,这意味着在第一行中 100
的累积库存为 20,而在第二行中 100
现在的累积库存为 -30。同样,对于第三行,100
的累积库存为 -60,第四行的累积库存为 -10,第五行的 100
的累积库存为 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
我昨天发布了一个关于累积总和的问题,但由于这个问题有点不同,我想我应该创建一个新主题(我还确保正确搜索论坛以防可以使用类似的东西)。
我想根据 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
列的左侧应该有一个时间戳,但我将其遗漏了,因为它不相关)。
现在有3个ID:100
、200
、300
,他们互相买卖,结果是buyer
在每一行获得库存,而 seller
失去库存。此外,如果相同的 ID 在 buyer
和 seller
列中,则库存保持不变。对于我的特定问题,我只关心ID 100
的累积库存,而不关心200
和300
的累积库存。
对于上面的示例,这意味着在第一行中 100
的累积库存为 20,而在第二行中 100
现在的累积库存为 -30。同样,对于第三行,100
的累积库存为 -60,第四行的累积库存为 -10,第五行的 100
的累积库存为 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