【发布时间】:2016-08-16 08:03:29
【问题描述】:
比如说,我有一个三维数组,其中项目为行,项目为列,参与者为第三维,同时出现计数中的值。 进一步注意,每个数组“切片”(= 项 x 项矩阵)都是对称的(因为它们是共现计数!)。
像这样:
a <- structure(c(17L, 1L, 0L, 1L, 1L, 17L, 0L, 1L, 0L, 0L, 17L, 0L, 1L, 1L, 0L, 17L, 16L, 0L, 0L, 1L, 0L, 16L, 0L, 0L, 0L, 0L, 16L, 0L, 1L, 0L, 0L, 16L, 18L, 1L, 2L, 3L, 1L, 18L, 1L, 2L, 2L, 1L, 18L, 0L, 3L, 2L, 0L, 18L), .Dim = c(4L, 4L, 3L), .Dimnames = structure(list(items = c("but-how", "encyclopedia", "alien", "comma"), items = c("but-how", "encyclopedia", "alien", "comma"), people = c("Julius", "Tashina", "Azra")), .Names = c("items", "items", "people")))
我现在想要参与者 x 参与者的相关系数矩阵,即 Julius、Tashina 和 Azra 各自的系数。
为此,我只想关联两个矩阵中它们各自的单元格,因此对于Azra 和Tashina,我将关联它们各自的上(或下)三角形。
这对我来说并不明显,因为cor() 和朋友不接受数组。
我可以通过一些 apply() 和 upper.tri() 操作来实现这一点,如下所示,但我猜 必须有一种更有效的矩阵魔法方式来做这个,对吧?
这是我现在做这个的hacky方式。别笑。
loosedat <- apply(X = a, MARGIN = c(3), FUN = function(x) {
x <- x[upper.tri(x = x, diag = FALSE)] # must kill diagonal, will otherwise inflate results
})
cor(loosedat)
得到我想要的,但我觉得这样做很脏。
Julius Tashina Azra
Julius 1.0000000 0.4472136 0.522233
Tashina 0.4472136 1.0000000 0.700649
Azra 0.5222330 0.7006490 1.000000
【问题讨论】:
-
等一下,你对我来说太快了:)
标签: arrays r matrix correlation