【发布时间】:2020-08-05 21:35:42
【问题描述】:
我有一个像这样的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))
gr1 和 gr2 指定每个案例的组成员身份。我想使用weight 列通过gr1 和gr2 指定的组成员资格从cov.wt 函数中获取相关矩阵。如果cor = TRUE,cov.wt 返回相关矩阵。我可以将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 under this question 的帖子一样。你,我很挣扎,因为额外的参数和从cov.wt 函数返回的列表中提取相关矩阵。我尝试了以下(加上许多变体):
mydt[ , .(cov.wt(as.matrix(a, b), wt = weight, cor = TRUE)["cor"]), by = c("gr1", "gr2")]
我最后得到的只是每个矩阵对角线的第一个值。
我做错了什么?
【问题讨论】:
标签: r data.table grouping weighted