我有一系列包含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/