2016-12-23 10 views
2

Ich habe eine Reihe von zweidimensionalen numerischen Matrizen bestehend aus 1s und 0s. (Ich nehme an, sie können auch als logische Arrays betrachtet werden.) Was ich für solche Arrays tun kann, ist einen Vektor zu generieren, der die Länge einer Dimension des Arrays hat (die Anzahl der Spalten). Es würde enthalten, für jede Spalte in der Anordnung, die Summe der Reihe für die Zeilen beträgt, wo der Eintrag 1.Iterative bedingte Summen in R

Hier ist das, was ich für einzelne Spalten haben:

#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)]) 

Offensichtlich statt Schreiben M1_1 , M1_2, ..., M1_n, Ich möchte M1_X definieren, um jede Spalte zu durchlaufen. Ich vermute, dass es eine sehr einfache Sache ist, aber ich konnte nicht herausfinden, wie es geht. Jede Anleitung würde geschätzt werden.

+0

Beachten Sie, dass Sie used 'sample' ohne' set.seed', so kann die Ausgabe für jeden variieren. –

Antwort

2

Wir können mit sapply Schleife und erhalten die 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 

Oder apply

apply(dataset, 2, function(x) sum(scores[x==1])) 
#[1] 56 47 50 53 55 48 75 67 40 55 

oder ein vektorisiert Ansatz wäre, die 'Noten' zu replizieren und multiplizieren es mit 'datensatz' ohne recycling (was sein kann manchmal gefährlich)

colSums(scores[row(dataset)]*dataset) 
#[1] 56 47 50 53 55 48 75 67 40 55 

Oder eine andere intuitive Option ist sweep

colSums(sweep(dataset, 1, scores, FUN = "*")) 
#[1] 56 47 50 53 55 48 75 67 40 55 

Basierend auf OPs Post,

M1_1 
#[1] 56 
M1_2 
#[1] 47 

Oder wie @ user20650 kommentierte eine kurze Option ist crossprod

crossprod(scores, dataset) 

Oder sogar ohne

rowSums(crossprod(dataset)) 
#[1] 56 47 50 53 55 48 75 67 40 55 
2

Wir arbeiten mit den entsprechenden Noten die Matrix von 0'en nur vermehren und 1'en ‚Partituren‘ in einem anderen Schritt berechnen und dann die Summe spaltenweise

colSums(dataset * scores) 

#[1] 44 58 50 53 42 60 43 46 55 45 
erhalten
1

Matrix-Multiplikation funktioniert auch (reproduzierbar mit Saatgut 123):

as.numeric(matrix(scores, nrow=1) %*% dataset) 
# [1] 53 72 16 51 43 49 51 49 30 66