簡體   English   中英

高效的R矩陣比較

[英]Efficient R matrix comparison

在R中,我有兩個矩陣x和y,它們的列數相同,例如:

x <- matrix(runif(10*20),10,20)
y <- matrix(runif(50*20),50,20)

創建包含以下比較結果的矩陣的最有效方法是什么。 將x中的每一行與y中的每一行進行比較(10x50行比較),返回y行中的數字小於x行中的對應數字的數量。 將結果放入10x50結果矩陣中。

以下代碼有效,但效率不高:

result <- matrix(NA,10,50)    
for (i in 1:10) {
      for (j in 1:50) {
        result[i,j]<- sum(x[i,]>y[j,])
      }
    }

確實您的代碼無法運行,但是我認為您的意思是y <- matrix(runif(50*20),50,20) ,對嗎?

在這種情況下,您可以使用outer函數:

outer(rowSums(x), rowSums(y), function(x, y) x > y)

編輯

抱歉,我明白你的意思,也可能由於錯誤而得到了。 我認為這將大大加快您的工作速度:

result2 <- rowSums(x[rep(1:nrow(x), nrow(y)), ] >
     y[rep(1:nrow(y), each = nrow(x)), ]) %>% 
    matrix(nrow = nrow(x))

我猜想y <- matrix(runif(50)) ,您可以嘗試使用單個循環來加快計算速度:

t(apply(y,1,function(u) rowSums(x<u)))

該答案基於@ColonelBeauvel的答案。 為了加快計算速度,您可以使用一個循環而不是兩個循環,並在較小的矩陣上循環(在您的示例x )。

t(apply(x, 1, function(u)colSums(u > t(y))))

另一個重要說明是u < t(y) R按列比較矩陣,這就是為什么首先轉置y如此重要的原因。

基准測試的完整示例:

set.seed(1)
x <- matrix(runif(10*20),10,20)
y <- matrix(runif(50*20),50,20)

f0 <- function(x, y) {
result <- matrix(NA,10,50)
for (i in 1:10) {
      for (j in 1:50) {
        result[i,j]<- sum(x[i,]>y[j,])
      }
    }
result
}

f1 <- function(x, y)t(apply(x,1,function(u)colSums(u>t(y))))

all.equal(f0(x, y), f1(x, y))
# [1] TRUE

benchmark(f0(x, y), f1(x, y), order="relative")
#       test replications elapsed relative user.self sys.self user.child sys.child
# 2 f1(x, y)          100   0.035    1.000     0.032    0.004          0         0
# 1 f0(x, y)          100   0.253    7.229     0.252    0.000          0         0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM