我在R中有一个矩阵,这是一个小例子:
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,] 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
v<-c(1,3,6)
,其元素理论上可以出现在上面的矩阵mat
中。
我正在寻找的是概述v
中每个元素在mat
每列 中出现的次数。对于当前示例,此概述是
1: 0 1 0 0 1 1
3: 1 0 1 1 0 1
6: 0 1 1 0 1 0
使用for
- 循环和if
- 语句执行此操作相当简单,但此解决方案并不是很漂亮。
有没有专业的方法来做到这一点?
答案 0 :(得分:1)
使用sapply
的一个选项:
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
答案 1 :(得分:1)
使用table
:
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
以外的所有值的列。
答案 2 :(得分:1)
在data.frame上使用sapply
迭代列。
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