我是 R 新手,并嘗試計算資料幀或矩陣中列的任何組合的固定矩陣與 2 路頻率表之間的乘積,并將其除以序列長度(也就是 15 行) ,問題是在 1K 序列(1K 列)上執行時,運行時間會急劇增加。目標是盡可能多地使用它(超過 10 分鐘,10K 可能超過 1 小時)
mat1 <- matrix(sample(LETTERS),ncol = 100,nrow = 15)
mat2 <- matrix(sample(abs(rnorm(26,0,3))),ncol=26,nrow=26)
rownames(mat2) <- LETTERS
colnames(mat2) <- LETTERS
diag(mat2) <- 0
test_vec <- c()
for (i in seq(ncol(mat1)-1)){
for(j in seq(i 1,ncol(mat1))){
s2 <- table(mat1[,i],mat1[,j]) # create 2-way frequency table
mat2_1 <- mat2
mat2_1 <- mat2_1[rownames(mat2_1) %in% rownames(s2),
colnames(mat2_1) %in% colnames(s2)]
calc <- ((1/nrow(mat1))*sum(mat2_1*s2))
test_vec <- append(test_vec,calc)
}}
謝謝您的幫助。
uj5u.com熱心網友回復:
這是一種將 mat1 轉換為 data.table 并將所有列轉換為因子的方法,并使用table(..., exclude=NULL)
library(data.table)
m=as.data.table(mat1)[,lapply(.SD, factor, levels=LETTERS)]
g = combn(colnames(m),2, simplify = F)
result = sapply(g, function(x) sum(table(m[[x[1]]], m[[x[2]]], exclude=NULL)*mat2)/nrow(m))
檢查相等性:
sum(result-test_vec>1e-10)
[1] 0
這里有 4950 種組合(100*99/2),但是隨著 nrow(mat1) 的增加,組合的數量會迅速增加(正如你所指出的那樣)。在這種情況下,您可能會發現并行化版本運行良好。
library(doParallel)
library(data.table)
registerDoParallel()
m=as.data.table(mat1)[,lapply(.SD, factor, levels=LETTERS)]
g = combn(colnames(m),2, simplify = F)
result = foreach(i=1:length(g), .combine=c) %dopar%
sum(table(m[[g[[i]][1]]], m[[g[[i]][2]]], exclude=NULL)*mat2)
result = result/nrow(m)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460983.html
下一篇:根據時間戳之間的差異求和
