[英]Count rows based on multiple criteria
我有一個簡單的問題,但我不知道如何解決這個...我有兩個矩陣,我試圖在第一個中創建一個列,表示第二個中的一行匹配一個列的次數一套標准。 例如,假設我有Matrix A
Ad1 Ad2 Ad3 Ad4
AA 101 0 10
AA 101 10 12
AA 101 12 15
AA 101 15 20
AA 300 0 100
AA 300 100 230
AA 300 230 300
...
和矩陣B是
Bd1 Bd2 Bd3
AA 101 0
AA 101 1
AA 101 2
AA 101 4
AA 101 5
...
AB 102 1
AB 102 10
...
我希望兩個在A中創建第五列,其中B中的行數與下列條件匹配(對於A的每一行):
(A$Ad1==B$Bd1) & (A$Ad2==B$Bd2) & (A$Ad3<=B$Bd3) & (A$Ad4>B$Bd3)
有沒有辦法在不為A的每一行創建循環的情況下執行此操作?
第一列的因子性質可能會受到影響,因此第一次比較需要使用as.character或%in%:
A = read.table(text="Ad1 Ad2 Ad3 Ad4
AA 101 0 10
AA 101 10 12
AA 101 12 15
AA 101 15 20
AA 300 0 100
AA 300 100 230
AA 300 230 300", header=TRUE)
B = read.table(text=" Bd1 Bd2 Bd3
AA 101 0
AA 101 1
AA 101 2
AA 101 4
AA 101 5
AB 102 1
AB 102 10", header=TRUE)
> with( A, mapply(function(x,y,z,z2){sum((x %in% B$Bd1) & (y == B$Bd2) &
(z <= B$Bd3) & (z2 > B$Bd3) )},
Ad1, Ad2, Ad3, Ad4) )
[1] 5 0 0 0 0 0 0
> with( A, mapply(function(x,y,z,z2){sum((as.character(x) == B$Bd1) & (y == B$Bd2) &
(z <= B$Bd3) & (z2 > B$Bd3) )},
Ad1, Ad2, Ad3, Ad4) )
[1] 5 0 0 0 0 0 0
這是使用==
拋出的錯誤
> factor("a", levels=c("a","b")) == factor("a")
Error in Ops.factor(factor("a", levels = c("a", "b")), factor("a")) :
level sets of factors are different
你可以apply
:
A = read.table(text="
Ad1 Ad2 Ad3 Ad4
AA 101 0 10
AA 101 10 12
AA 101 12 15
AA 101 15 20
AA 300 0 100
", header=T)
B = read.table(text="
Bd1 Bd2 Bd3
AA 101 0
AA 101 1
AA 101 2
AA 101 10
AA 101 12
", header=T)
使用apply來計算您的條件為A中每行保留的行數。
apply(A, 1, function(x) {
sum( (x["Ad1"] == B$Bd1) &
(as.numeric(x["Ad2"]) == B$Bd2) &
(as.numeric(x["Ad3"]) <= B$Bd3) &
(as.numeric(x["Ad4"]) > B$Bd3) )
})
[1] 3 1 1 0 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.