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