Wie eine Schleife durch eine matrix Zeilen von i:n und Spalten
Ich bin noch ein Anfänger in r. Ich versuche eine Schleife durch eine matrix und berechnen von Summen looping aus jeder einzelnen Zeile(1:5), bis der Schwellenwert (z.B. 14) in dieser Zeile erreicht ist. Dann gehen Sie durch alle Spalten (2:6). Was ich will ist, dass meine matrix(b) ist gefüllt mit den Nummern(91:95), wo die Zeilen haben den Schwellenwert erreicht. Ich habe versucht, diese. Hat jemand eine Idee, was ich falsch mache.
a <- matrix(c(91:95,1:25), ncol=6)
b <- matrix(NA,ncol=6,nrow=5)
for(i in 1:nrow(a)) {
for(j in 2:ncol(a)) {
for(n in 1:5) {
if(sum(a[seq(i:n),j])>14) {
b[i,j] <- a[n,1]
break
}
}
}
}
Dies ist mein Ergebnis.
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] NA 95 93 92 91 91
[2,] NA NA 94 91 91 91
[3,] NA NA 91 91 91 91
[4,] NA NA 91 91 91 91
[5,] NA 91 91 91 91 91
Mein gewünschtes Ergebnis sollte wie folgt Aussehen. Die Ergebnisse sollten auf den Startpunkt(i) und zeigen Sie die Zeile (n) wo der Schwelle(14) wurde überschritten.
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] NA 95 93 92 91 91
[2,] NA NA 93 93 91 91
[3,] NA NA 94 94 91 91
[4,] NA NA 95 95 91 91
[5,] NA NA NA 95 91 91
Kann mir jemand helfen mit diesem.
Vielen Dank im Voraus. Ist auch einfacher, die Ideen als geschachtelte Schleifen sind geschätzt.
- Nicht sicher, ob ich Verstand Ihr problem, aber in der 4. Zeile in der Schleife sollte nur
i:n
oderseq(i,n)
und nichtseq(i:n)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist der Ansatz ähnlich wie das von @josiber aber mit
dplyr
(vorausgesetzt, es ist ein Fehler in die erwartete Ausgabe). Der erste block von code, den ich.e bis zu der Erstellung von "df1" ist im Grunde erstellen von Replikationen von "0" - Zeilen für eine Gruppierung der variable "ind". Wir erstellen ein n Wiederholungen von "a" (rep(list(a), n)
) dannrbind
es um die form der matrix "a1", ein index matrix "i1" von "1s" die gleichen Abmessungen wie "a1". Das "i1" matrix aufgefüllt mit "0" - Zeilen basierend auf dem "m1" - index, und erstellen Sie eine Daten.Rahmen("df1") mit grouping variable "ind" und die anderen Spalten wird das Ergebnis von "a1*i1", so dass Elemente in "i1", das sind "0" "0" ausgegeben.Verwendung von "df1", verwenden wir "ind", wie die Gruppierung der Variablen (
group_by
) und fasse die Spalten ("X1:X5") mitsummarise_each
. Erhalten wir den index der Elemente in jeder Spalte, die eine kumulative Summe größer als 14, und verwenden Sie diese als index, um die Elemente von "a" (o[which(cumsum(.)>14)..
)Benötigen oder wenn Sie eine matrix-Ausgang, anstelle des "dplyr" erstellen Sie die "indx" mit
Map
und verwendentapply
um das Ergebnis zu erhalten.Daten
Als ich Ihre Frage verstehe, ist das element (i, j) von Ihrem Ergebnis enthalten soll die Zeile identifier für die erste Zeile, wo die kumulative Summe (i, j) + (i+1, j) + (i+2, j) + ... übersteigt 14, und es sollte
NA
wenn das kumulative Summe nie mehr als 14 vor dem erreichen der unteren Rand des input-matrix. In diesem Fall ist die erwartete Ausgabe enthält einen Fehler -- die beiden rechten Spalten werden sollte, 91, 92, 93, 94, 95 statt 91, 91, 91, 91, 91.Für jede Spalte der input-matrix (wir arbeiten mit
apply
mit Marge 2) Sie können eine for-Schleife (ich benutzesapply
mehr als eine komfortable alternative unten), Berechnung der kumulierten Summe der Spalte ignorieren-element über die element-Sie kalkulieren: