在R

时间:2016-12-23 03:26:37

标签: arrays r sumifs

我有一系列包含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来遍历每一列。我怀疑这是一件非常简单的事情,但是我们无法弄清楚如何去做。任何指导都将不胜感激。

3 个答案:

答案 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