根据多个条件计算行数

时间:2014-01-03 23:13:28

标签: r count

我有一个简单的问题,但我不知道如何解决这个问题...... 我有两个矩阵,我试图在第一个列中创建一个列,表示第二个中的行与一组条件匹配的次数。例如,假设我有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的每一行创建循环的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

第一列的因子性质可能会受到阻碍,因此第一次比较需要使用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

答案 1 :(得分:0)

你可以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条件中每个行所包含的B行数。

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