我有一个 data.table
像这个。
set.seed(12345)
mydt <- data.table(gr1 = sample(letters[1:2], size = 100, replace = TRUE),
gr2 = sample(letters[3:4], size = 100, replace = TRUE),
a = rnorm(100), b = rnorm(100), weight = rnorm(100, 5, 1))
The gr1
和 gr2
指定每个案例的组成员。我想从以下数据中获得相关矩阵 cov.wt
的组别成员来执行该功能。gr1
和 gr2
,使用 weight
栏目。栏。cov.wt
返回相关矩阵,如果 cor = TRUE
. 我可以分开 mydt
由 gr1
和 gr2
再用 lapply
来进行计算并提取每个相关矩阵。
mydt <- split(x = mydt, by = c("gr1", "gr2"), drop = TRUE)
lapply(X = mydt, FUN = function(i) {
cov.wt(x = as.matrix(i[ , c("a", "b")]), wt = i[ , weight], cor = TRUE)[["cor"]]
})
我得到的正是我想要的。
$b.c
a b
a 0.99999999999999978 0.26861150206539375
b 0.26861150206539375 0.99999999999999978
$a.c
a b
a 0.99999999999999978 -0.13281683546112405
b -0.13281683546112405 1.00000000000000000
$b.d
a b
a 1.00000000000000000 -0.13064774898011455
b -0.13064774898011455 1.00000000000000000
$a.d
a b
a 0.99999999999999978 -0.61122086293705469
b -0.61122086293705458 0.99999999999999978
然而,对于大数据集,这种方法相当缓慢。我想使用 data.table
的方式来实现,就像Dan Y的帖子一样。在此问题下. 我正在努力,你,因为额外的参数和提取相关矩阵从返回的列表中的 cov.wt
功能。我尝试了以下方法(加上许多变化)。
mydt[ , .(cov.wt(as.matrix(a, b), wt = weight, cor = TRUE)["cor"]), by = c("gr1", "gr2")]
最后得到的只是每个矩阵对角线的第一个值。
我做错了什么?
在这里 as.matrix
是错误的,因为'x'是一个单一元素,而不是多个元素(根据 ?as.matrix
). 一种方法是通过以下方式转换为矩阵 cbind
ing向量'a', 'b',然后将输出包在一个列表中(用 .()
)
library(data.table)
out <- mydt[ , .(.(cov.wt(cbind(a,b), wt = weight, cor = TRUE)["cor"])),
by = c("gr1", "gr2")]
out$V1
#[[1]]
#[[1]]$cor
# a b
#a 1.0000000 0.2686115
#b 0.2686115 1.0000000
#[[2]]
#[[2]]$cor
# a b
#a 1.0000000 -0.1328168
#b -0.1328168 1.0000000
#[[3]]
#[[3]]$cor
# a b
#a 1.0000000 -0.1306477
#b -0.1306477 1.0000000
#[[4]]
#[[4]]$cor
# a b
#a 1.0000000 -0.6112209
#b -0.6112209 1.0000000
注:由于种子的原因,数值会有差异。