在R中迭代条件和

在R中迭代条件和

我有一系列包含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以遍历每一列。我怀疑这是一件很简单的事情,但是还没有弄清楚该怎么做。任何指导将不胜感激。

最佳答案

我们可以与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

关于arrays - 在R中迭代条件和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41294772/

10-12 06:51