[英]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.