r - 如何从 data.table 构建外积矩阵

标签 r matrix data.table outer-join

我不知道如何解决这个问题,我唯一能想到的就是强力循环,但我什至不确定如何遍历 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/

相关文章:

r - Windows 脚本宿主失败

r - 如何在ggplot直方图中定义填充颜色?

python - NumPy 中与 NaN 相关的矩阵

python - OpenGL正确的矩阵变换顺序以在定点旋转对象

r - 在 data.table 计算中使用选择中的总行数

r - `bookdown`/`rmarkdown`/`knitr` : Child documents and path definition in `YAML` headers

r - 根据条件拆分数据帧

c++ - 使用 win32 线程进行矩阵乘法

r - 使用 data.table 获得内存缓存的好方法

r - fread 的填充选项