簡體   English   中英

根據多個條件計算行數

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

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