我们有两个矩阵,我们分别用A和B表示。目的是找到A的每一行出现在B中的次数,在向量x中记忆这些数字,其第i个元素对应于第i行的A.例如:
# A=
1 2 3
1 1 1
2 0 1
1 4 5
# B=
2 0 1
0 0 1
0 0 2
然后矢量x是:
0 0 1 0
因为行
1 2 3, 1 1 1, 1 4 5
在B中出现0次,而行
2 0 1
在B中出现一次。
以下是我的解决方案:
m3 <- rbind(A, B)
count(m3)
返回:
x.1 x.2 x.3 freq
1 0 0 1 1
2 1 0 2 1
3 1 1 1 1
4 1 2 3 1
5 1 4 5 1
6 2 0 1 2
这不是令人满意的结果。正确的一个考虑到A的原始顺序(而B的剩余行的顺序无关紧要);在我们的例子中:
1 1 2 3 1
2 1 1 1 1
3 2 0 1 2
4 1 4 5 1
1 0 0 1 1
2 1 0 2 1
答案 0 :(得分:1)
使用dplyr
的解决方案。 m_final
是最终输出。
library(dplyr)
dt <- rbind(A, B) %>%
as_data_frame()
dt_unique <- dt %>%
distinct()
dt_count <- dt %>%
group_by_all() %>%
count()
m_final <- dt_unique %>%
left_join(dt_count) %>%
as.matrix()
m_final
# V1 V2 V3 n
# [1,] 1 2 3 1
# [2,] 1 1 1 1
# [3,] 2 0 1 2
# [4,] 1 4 5 1
# [5,] 0 0 1 1
# [6,] 0 0 2 1
数据强>
A <- matrix(c(1, 2, 3,
1, 1, 1,
2, 0, 1,
1, 4, 5), ncol = 3, byrow = TRUE)
B <- matrix(c(2, 0, 1,
0, 0, 1,
0, 0, 2), ncol = 3, byrow = TRUE)
答案 1 :(得分:1)
这是一个简短的版本:
x <- vector()
for(i in 1:nrow(A)) x[i] = sum(colSums(!t(B) - A[i,] == 0) == 0)
或者你可以为apply
循环使for
更清晰。答案,
> x
[1] 0 0 1 0
这是apply
版本:
x <- sapply(1:nrow(A), function(x) sum(colSums(!t(B) - A[x,] == 0) == 0) )
我确信它可以进一步简化。