关于r:找出矩阵中向量元素的频率

 2021-04-26 

Find frequency of vector elements in a matrix

我在R中有一个矩阵,这是一个小例子:

1
2
3
4
5
6
7
set.seed(1)
n.columns<-6
mat <- matrix(, nrow = 5, ncol = n.columns)
for(column in 1:n.columns){
  mat[, column] <- sample(1:10,5)
}
mat

矩阵如下:

1
2
3
4
5
6
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    3    9    3    5   10    4
[2,]    4   10    2    7    2    1
[3,]    5    6    6    8    6   10
[4,]    7    5   10    3    1    7
[5,]    2    1    5   10    9    3

我还有一个整数v<-c(1,3,6)的向量v,从理论上讲,其元素可以出现在上面的矩阵mat中。

我要寻找的是每个列中v中每个元素出现在mat中的次数的概述。对于当前示例,此概述为

1
2
3
1: 0 1 0 0 1 1
3: 1 0 1 1 0 1
6: 0 1 1 0 1 0

使用for循环和if语句执行此操作非常简单,但是这种解决方案不是很漂亮。

有专业的方法吗?


在data.frame上使用sapply遍历列。

1
2
3
4
5
6
7
8
9
10
setNames(object = as.data.frame(sapply(v, function(a)
         sapply(as.data.frame(mat), function(b)
                             sum(a %in% b)))), nm = v)
#   1 3 6
#V1 0 1 0
#V2 1 0 1
#V3 0 1 1
#V4 0 1 0
#V5 1 0 1
#V6 1 1 0

使用table

1
2
3
4
5
6
table(mat[mat %in% v], col(mat)[mat %in% v])

#   1 2 3 4 5 6
# 1 0 1 0 0 1 1
# 3 1 0 1 1 0 1
# 6 0 1 1 0 1 0

缺点是不会报告所有不在v中的值的列。


使用sapply

的一个选项

1
2
3
4
5
6
t(sapply(v, function(a) colSums(mat==a)))

#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    0    1    0    0    1    1
#[2,]    1    0    1    1    0    1
#[3,]    0    1    1    0    1    0