簡體   English   中英

計算與 R 中的值匹配的行的更快方法

[英]Faster way to count rows matching a value in R

我的代碼有效,但速度極慢。 我想要做的是取兩個長度相等的向量,逐行檢查值,並計算都等於 1 的行數。我想強調的是,我不想將每個向量的次數相加向量本身的值是 1。相反,當這些向量並排排列時,我們看到多少次兩行都等於 1?

我已經通過一個 for 循環和一個 if 語句完成了這一點,其中我循環遍歷“行對”並在每次有一個匹配的對等於 1 時將一個變量增加 +1。該代碼在下面,但它太慢了。 我必須使用至少 4e6 長的 2000 多個向量來執行此操作。

相對較新的 R 在這里,但如果有人對更快的方法有任何其他想法,我很感激任何建議。

vec1 <- rep(c(0,0,1,1),times = 10)
vec2 <- rep(c(0,1,0,1),times = 10)

mat <- cbind(vec1,vec2)

matches <- 0
for(i in 1:length(mat[,1])){
  if(mat[i,1] == 1 & mat[i,2] == 1){
    matches <- matches + 1
  }
} 

如果向量只有 1 和 0 值:

sum(rowSums(mat) == 2)
#[1] 10

如果它們可以具有不同的值,請將其與 1 進行比較:

sum(rowSums(mat == 1) == 2)

要獲得兩列都為 1 的行號,我們可以使用which

which(rowSums(mat) == 2)
#[1]  4  8 12 16 20 24 28 32 36 40

Go 邏輯和相加,將 TRUE 和 FALSE 分別計為 1 和 0

sum( (vec1 == 1) & (vec2 == 1))
#[1] 20

僅處理向量:

sum(vec1 * vec2)
# [1] 10

sum(vec1 & vec2)
# [1] 10

sum(vec1[!!vec2])
# [1] 10

# and going mad
vec1 %*% vec2
#      [,1]
# [1,]   10

# or even
sum(Mod(complex(real = vec1, imaginary = vec2)) == sqrt(2)) #joking
# [1] 10

暫無
暫無

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

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