Cor*_*one 3 r matrix outer-join data.table
我不知道如何解决这个问题,我唯一想到的就是蛮力循环,但是我什至不确定如何以data.table
一种明智的方式循环遍历整个行。
我有一个双键data.table
和一个基于这些键中第一个的相关矩阵。我需要通过查找任何给定对的相关性来建立所有元素的完整相关性矩阵,如果第二个键不匹配,则相关性为零。
简化示例:
library(data.table)
DT = data.table(Key1 = c("A", "A", "A", "B", "B", "C", "C"), Key2 = c(1,2,3,2,3,3,4), OtherData = "Irrelevant")
setkey(DT, Key2, Key1)
M = matrix(c(1.0, 0.4, 0.3,
0.4, 1.0, 0.2,
0.3, 0.2, 1.0), nrow = 3)
Run Code Online (Sandbox Code Playgroud)
所以我们的起始data.table看起来像:
> DT
Key1 Key2 OtherData
1: A 1 Irrelevant
2: A 2 Irrelevant
3: B 2 Irrelevant
4: A 3 Irrelevant
5: B 3 Irrelevant
6: C 3 Irrelevant
7: C 4 Irrelevant
Run Code Online (Sandbox Code Playgroud)
当A,B和C共享相同的Key2值时,它们的预定义相关矩阵由M给出:
> M
[,1] [,2] [,3]
[1,] 1.0 0.4 0.3
[2,] 0.4 1.0 0.2
[3,] 0.3 0.2 1.0
Run Code Online (Sandbox Code Playgroud)
现在,我需要制作一个如下所示的7x7矩阵:
> result
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1.0 0 0 0 0 0 0
[2,] 0 1.0 0.4 0 0 0 0
[3,] 0 0.4 1.0 0 0 0 0
[4,] 0 0 0 1.0 0.4 0.3 0
[5,] 0 0 0 0.4 1.0 0.2 0
[6,] 0 0 0 0.3 0.2 1.0 0
[7,] 0 0 0 0 0 0 1.0
Run Code Online (Sandbox Code Playgroud)
在这里我们使用与每个Key2上可用的Key1值匹配的M的一部分创建了块对角矩阵(Key2实际上是时间)。
这是一种方法(虽然不确定如何缩放):
rownames(M) <- colnames(M) <- LETTERS[1:3]
ans <- DT[, list(idx1=.I, idx2=rep(.I, each=.N),
val=as.vector(M[Key1, Key1])), by=Key2]
dcast.data.table(ans, idx2 ~ idx1, value.var="val", fill=0L)
# idx2 1 2 3 4 5 6 7
# 1: 1 1 0.0 0.0 0.0 0.0 0.0 0
# 2: 2 0 1.0 0.4 0.0 0.0 0.0 0
# 3: 3 0 0.4 1.0 0.0 0.0 0.0 0
# 4: 4 0 0.0 0.0 1.0 0.4 0.3 0
# 5: 5 0 0.0 0.0 0.4 1.0 0.2 0
# 6: 6 0 0.0 0.0 0.3 0.2 1.0 0
# 7: 7 0 0.0 0.0 0.0 0.0 0.0 1
Run Code Online (Sandbox Code Playgroud)
dcast.data.table
可从data.table版本获得>= 1.9.0
。在撰写本文时,当前的稳定CRAN版本是1.9.2。