gpt4 book ai didi

R-创建交易对方频率矩阵

转载 作者:行者123 更新时间:2023-12-04 10:55:14 24 4
gpt4 key购买 nike

我有易货经济的数据。我正在尝试创建一个矩阵来计算项目作为其他项目的交易对手的频率。

举个例子:

  myDat <- data.frame(
TradeID = as.factor(c(1,1,1,2,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8)),
Origin = as.factor(c(1,0,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0)),
ItemID = as.factor(c(1,2,3,4,5,1,1,6,7,1,1,8,7,5,1,1,2,3,4))
)


TradeID Origin ItemID
1 1 1 1
2 1 0 2
3 1 0 3
4 2 1 4
5 2 1 5
6 2 0 1
7 3 1 1
8 3 0 6
9 4 1 7
10 4 0 1
11 5 1 1
12 5 0 8
13 6 1 7
14 6 0 5
15 7 1 1
16 7 0 1
17 8 1 2
18 8 0 3
19 8 0 4
20 9 1 1
21 9 0 8

其中 TradeID 表示特定交易。 ItemID表示元素,Origin表示元素去向。

例如,根据我的数据,我将创建的矩阵如下所示: enter image description here

  • 例如,[1,8] 处的值 2 表示项目 1 和 8 是两笔交易的交易对手。 (请注意,它是一个对称矩阵,因此 [8,1] 的值也为 2)。
  • 虽然 [1,2] 处的值 1 表示项目 1 和 2 仅是一笔交易的交易对手(矩阵中所有其他 1 表示相同)
  • 作为一个奇怪的例子,请注意 [1,1],值 1 表示项目 1 曾是其自身的交易对手(交易编号 7)
  • 对我的动机有一点额外的了解,请注意在我的简单示例中,项目 1 往往充当许多不同项目的交易对手。在易货经济(没有显性货币)中,我们可能期望商品货币比非商品货币更频繁地成为交易对手。像这样的矩阵将是发现哪个项目是商品货币的第一步。

我已经为此苦苦挣扎了一段时间。但我认为我几乎完成了一个过于复杂的解决方案,我将很快发布。

我很好奇你们是否也可以提供一些帮助。

最佳答案

好吧,我想我已经弄明白了。简短的回答是:

Reduce("+",by(myDat, myDat$TradeID, function(x) pmin(table(x$ItemID[x$Origin==0]) %o% table(x$ItemID[x$Origin==1]) + table(x$ItemID[x$Origin==1]) %o% table(x$ItemID[x$Origin==0]),1)))

给出以下矩阵,匹配所需的结果:

  1 2 3 4 5 6 7 8
1 1 1 1 1 1 1 1 2
2 1 0 1 1 0 0 0 0
3 1 1 0 0 0 0 0 0
4 1 1 0 0 0 0 0 0
5 1 0 0 0 0 0 1 0
6 1 0 0 0 0 0 0 0
7 1 0 0 0 1 0 0 0
8 2 0 0 0 0 0 0 0

这是长答案。您可以使用 byouter (%o%) 和 功能。但这会重复计算交易 7,其中商品 1 交易商品 1,因此我使用 pmax 函数来解决此问题。然后,我使用 Reduce 函数对列表求和。

这是到达那里的步骤。请注意问题代码中遗漏的 TradeID #9。

# Data
myDat <- data.frame(
TradeID = as.factor(c(1,1,1,2,2,2,3,3,4,4,5,5,6,6,7,7,8,8,8,9,9)),
Origin = as.factor(c(1,0,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0)),
ItemID = as.factor(c(1,2,3,4,5,1,1,6,7,1,1,8,7,5,1,1,2,3,4,1,8))
)

# Sum in 1 direction
by(myDat, myDat$TradeID, function(x) table(x$ItemID[x$Origin==0]) %o% table(x$ItemID[x$Origin==1]))

# Sum in both directions
by(myDat, myDat$TradeID, function(x) table(x$ItemID[x$Origin==1]) %o% table(x$ItemID[x$Origin==0]) + table(x$ItemID[x$Origin==0]) %o% table(x$ItemID[x$Origin==1]))

# Remove double-count in trade 7
by(myDat, myDat$TradeID, function(x) pmin(table(x$ItemID[x$Origin==0]) %o% table(x$ItemID[x$Origin==1]) + table(x$ItemID[x$Origin==1]) %o% table(x$ItemID[x$Origin==0]),1))

# Sum across lists
Reduce("+",by(myDat, myDat$TradeID, function(x) pmin(table(x$ItemID[x$Origin==0]) %o% table(x$ItemID[x$Origin==1]) + table(x$ItemID[x$Origin==1]) %o% table(x$ItemID[x$Origin==0]),1)))

加快速度的一种方法是仅在一个方向上求和(利用对称性),然后清理结果。

result = Reduce("+",by(myDat, myDat$TradeID, function(x) table(x$ItemID[x$Origin==0]) %o% table(x$ItemID[x$Origin==1])))
result2 = result + t(result)
diag(result2) = diag(result)
result2
1 2 3 4 5 6 7 8
1 1 1 1 1 1 1 1 2
2 1 0 1 1 0 0 0 0
3 1 1 0 0 0 0 0 0
4 1 1 0 0 0 0 0 0
5 1 0 0 0 0 0 1 0
6 1 0 0 0 0 0 0 0
7 1 0 0 0 1 0 0 0
8 2 0 0 0 0 0 0 0

这似乎运行速度几乎是原来的两倍。

> microbenchmark(Reduce("+",by(myDat, myDat$TradeID, function(x) pmin(table(x$ItemID[x$Origin==0]) %o% table(x$ItemID[x$Origin==1]) + table(x$ItemID[x$Origin==1]) %o% table(x$ItemID[x$Origin==0]),1))))
Unit: milliseconds
min lq median uq max neval
7.489092 7.733382 7.955861 8.536359 9.83216 100

> microbenchmark(Reduce("+",by(myDat, myDat$TradeID, function(x) table(x$ItemID[x$Origin==0]) %o% table(x$ItemID[x$Origin==1]))))
Unit: milliseconds

min lq median uq max neval
4.023964 4.18819 4.277767 4.452824 5.801171 100

关于R-创建交易对方频率矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21415159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com