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