我不知道如何解决这个问题,我唯一能想到的就是强力循环,但我什至不确定如何遍历 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)
所以我们的起始 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
当 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
我现在需要制作一个 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
我们使用 M 中与每个 Key2 可用的 Key1 值匹配的部分创建 block 对角矩阵(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
dcast.data.table
可从 data.table 版本 >= 1.9.0
获得。在撰写本文时,当前稳定的 CRAN 版本是 1.9.2。
关于r - 如何从 data.table 构建外积矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21116348/