我有一系列包含1和0的二维数值矩阵。 (所以我认为它们也可以被视为逻辑数组。)我希望能够为这样的数组做的是生成一个数组一维长度的矢量(列数)。对于数组中的每一列,它将包含条目为1的行的总行数之和。
这是我对单列的看法:
#Generate sample data
dataset<-matrix(sample(0:1, size=190, replace=TRUE), nrow=19, ncol=10)
#Calculate row sums
scores<-rowSums(dataset)
#calculate desired statistic for column 1
M1_1 <- sum(scores[which (dataset[,1]==1)])
#calculate same statistic for column 2
M1_2 <- sum(scores[which (dataset[,2]==1)])
显然,我不想写M1_1,M1_2,...,M1_n,而是想要定义M1_X来遍历每一列。我怀疑这是一件非常简单的事情,但是我们无法弄清楚如何去做。任何指导都将不胜感激。
答案 0 :(得分:2)
我们可以使用sapply
循环并获取sum
as.vector(sapply(split(dataset, col(dataset)), function(x) sum(scores[x==1])))
#[1] 56 47 50 53 55 48 75 67 40 55
或使用apply
apply(dataset, 2, function(x) sum(scores[x==1]))
#[1] 56 47 50 53 55 48 75 67 40 55
或者矢量化方法是复制'得分'并将其与'数据集'相乘而不使用任何回收(有时可能是危险的)
colSums(scores[row(dataset)]*dataset)
#[1] 56 47 50 53 55 48 75 67 40 55
或另一个直观选项是sweep
colSums(sweep(dataset, 1, scores, FUN = "*"))
#[1] 56 47 50 53 55 48 75 67 40 55
基于OP的帖子,
M1_1
#[1] 56
M1_2
#[1] 47
或者@ user20650评论时,一个简洁的选项是crossprod
crossprod(scores, dataset)
或者甚至没有在不同的步骤中计算“得分”
rowSums(crossprod(dataset))
#[1] 56 47 50 53 55 48 75 67 40 55
答案 1 :(得分:2)
我们可以将0和1的矩阵与相应的分数相乘,然后按列进行求和
colSums(dataset * scores)
#[1] 44 58 50 53 42 60 43 46 55 45
答案 2 :(得分:1)
矩阵乘法也有效(可与种子123重现):
as.numeric(matrix(scores, nrow=1) %*% dataset)
# [1] 53 72 16 51 43 49 51 49 30 66