Ich habe ein Werteraster:
m <- matrix(c(2,4,5,5,2,8,7,3,1,6,
5,7,5,7,1,6,7,2,6,3,
4,7,3,4,5,3,7,9,3,8,
9,3,6,8,3,4,7,3,7,8,
3,3,7,7,5,3,2,8,9,8,
7,6,2,6,5,2,2,7,7,7,
4,7,2,5,7,7,7,3,3,5,
7,6,7,5,9,6,5,2,3,2,
4,9,2,5,5,8,3,3,1,2,
5,2,6,5,1,5,3,7,7,2),nrow=10, ncol=10, byrow = T)
r <- raster(m)
extent(r) <- matrix(c(0, 0, 10, 10), nrow=2)
plot(r)
text(r)
Wie kann ich in diesem Raster den 8 benachbarten Zellen der aktuellen Zelle Werte zuweisen (oder Werte ändern), wie in dieser Abbildung dargestellt? Ich habe einen roten Punkt in der aktuellen Zelle von dieser Codezeile platziert:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Hier wird das erwartete Ergebnis sein:
Dabei wird der Wert der aktuellen Zelle (dh 5 im Werteraster) durch 0 ersetzt.
Insgesamt müssen die neuen Werte für die 8 benachbarten Zellen wie folgt berechnet werden:
Neuer Wert = Durchschnitt der im roten Rechteck enthaltenen Zellenwerte * Abstand zwischen der aktuellen Zelle (roter Punkt) und der benachbarten Zelle (dh Quadrat (2) für diagonal benachbarte Zellen oder 1 auf andere Weise)
Aktualisieren
Wenn die Grenzen für die benachbarten Zellen außerhalb der Rastergrenzen liegen, muss ich neue Werte für die benachbarten Zellen berechnen, die die Bedingungen berücksichtigen. Die benachbarten Zellen, die die Bedingungen nicht einhalten, entsprechen "NA".
Wenn zum Beispiel die Referenzposition c (1,1) anstelle von c (5,5) unter Verwendung der [row, col] -Notation ist, kann nur der neue Wert in der unteren rechten Ecke berechnet werden. Das erwartete Ergebnis ist also:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Wenn die Referenzposition beispielsweise c (3,1) ist, können nur die neuen Werte in der oberen rechten, rechten und unteren rechten Ecke berechnet werden. Das erwartete Ergebnis ist also:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Hier ist mein erster Versuch, die Funktion zu verwenden, focal
aber ich habe einige Schwierigkeiten, einen automatischen Code zu erstellen.
Markieren Sie benachbarte Zellen
mat_perc <- matrix(c(1,1,1,1,1,
1,1,1,1,1,
1,1,0,1,1,
1,1,1,1,1,
1,1,1,1,1), nrow=5, ncol=5, byrow = T)
cell_perc <- adjacent(r, cellFromRowCol(r, 5, 5), directions=mat_perc, pairs=FALSE, sorted=TRUE, include=TRUE)
r_perc <- rasterFromCells(r, cell_perc)
r_perc <- setValues(r_perc,extract(r, cell_perc))
plot(r_perc)
text(r_perc)
Wenn sich die benachbarte Zelle in der oberen linken Ecke der aktuellen Zelle befindet
focal_m <- matrix(c(1,1,NA,1,1,NA,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
Wenn sich die benachbarte Zelle in der oberen mittleren Ecke der aktuellen Zelle befindet
focal_m <- matrix(c(1,1,1,1,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
Wenn sich die benachbarte Zelle in der oberen linken Ecke der aktuellen Zelle befindet
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
Wenn sich die benachbarte Zelle in der linken Ecke der aktuellen Zelle befindet
focal_m <- matrix(c(1,1,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
Wenn sich die benachbarte Zelle in der rechten Ecke der aktuellen Zelle befindet
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
Wenn sich die benachbarte Zelle in der unteren linken Ecke der aktuellen Zelle befindet
focal_m <- matrix(c(NA,NA,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
Wenn sich die benachbarte Zelle in der unteren mittleren Ecke der aktuellen Zelle befindet
focal_m <- matrix(c(NA,NA,NA,1,1,1,1,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
Wenn sich die benachbarte Zelle in der rechten unteren Ecke der aktuellen Zelle befindet
focal_m <- matrix(c(NA,NA,NA,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
raster
Paket und diefocal()
Funktion an (S. 90 Dokumentation): cran.r-project.org/web/packages/raster/raster.pdfmat <- matrix(c(1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0), nrow=5, ncol=5, byrow = T)
f.rast <- function(x) mean(x)*sqrt(2)
aggr <- as.matrix(focal(r, mat, f.rast))
. Wie kann ich das Ergebnis nur für die 8 benachbarten Zellen der aktuellen Zelle und nicht für das gesamte Raster erhalten? Hier sollte das Ergebnis sein:res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Vielen Dank !Antworten:
Die Funktion
AssignValuesToAdjacentRasterCells
unten gibt ein neues Rasterebene Objekt mit den aus der ursprünglichen zugeordnet gewünschten Werten Rastereingabe. Die Funktion prüft, ob die benachbarten Zellen von der Referenzposition innerhalb der Rastergrenzen liegen. Es werden auch Meldungen angezeigt, wenn eine Grenze überschritten ist. Wenn Sie die Referenzposition verschieben müssen, können Sie einfach eine Iteration schreiben, die die Eingabeposition in c ( i , j ) ändert .Dateneingabe
Funktion
Führen Sie Beispiele aus
Handlungsbeispiele
Abbildung Beispiel
Hinweis: weiße Blutkörperchen bedeuten
NA
Wertequelle
Für einen Matrixoperator auf einer kleinen Matrix ist dies sinnvoll und nachvollziehbar. Möglicherweise möchten Sie jedoch Ihre Logik wirklich überdenken, wenn Sie eine Funktion wie diese auf ein großes Raster anwenden. Konzeptionell verfolgt dies in der allgemeinen Anwendung nicht wirklich. Sie sprechen von einer so genannten Blockstatistik. Eine Blockstatistik beginnt jedoch naturgemäß an einer Ecke des Rasters und ersetzt Werteblöcke innerhalb einer angegebenen Fenstergröße durch einen Operator. Normalerweise dient diese Art von Operator zum Aggregieren von Daten. Es wäre wesentlich praktikabler, wenn Sie über die Verwendung von Bedingungen zur Berechnung eines Mittelwerts einer Matrix nachdenken würden. Auf diese Weise können Sie leicht eine Fokusfunktion verwenden.
Denken Sie daran, dass die Rasterfokusfunktion Datenblöcke einliest, die die Fokuswerte in der definierten Nachbarschaft basierend auf der an das Argument w übergebenen Matrix darstellen. Das Ergebnis ist ein Vektor für jede Nachbarschaft und das Ergebnis des Fokusoperators wird nur der Fokuszelle und nicht der gesamten Nachbarschaft zugewiesen. Stellen Sie sich vor, Sie greifen nach einer Matrix, die einen Zellenwert umgibt, bearbeiten ihn, weisen der Zelle einen neuen Wert zu und wechseln dann zur nächsten Zelle.
Wenn Sie sicherstellen, dass na.rm = FALSE ist, stellt der Vektor immer die exakte Nachbarschaft dar (dh denselben Längenvektor) und wird zu einem Matrixobjekt gezwungen, das innerhalb einer Funktion bearbeitet werden kann. Aus diesem Grund können Sie einfach eine Funktion schreiben, die den Erwartungsvektor aufnimmt, in eine Matrix zwingt, Ihre Nachbarschaftsnotationslogik anwendet und dann einen einzelnen Wert als Ergebnis zuweist. Diese Funktion kann dann an die Funktion raster :: focal übergeben werden.
Hier ist, was in jeder Zelle basierend auf einem einfachen Zwang und einer Auswertung des Fokusfensters passieren würde. Das "w" -Objekt wäre im Wesentlichen dieselbe Matrixdefinition, die man beim Übergeben des w-Arguments im Fokus verwenden würde. Dies definiert die Größe des Teilmengenvektors in jeder Fokusbewertung.
Erstellen Sie nun eine Funktion, die auf den Fokus angewendet werden kann, und wenden Sie die obige Logik an. In diesem Fall können Sie das se-Objekt als Wert zuweisen oder es als Bedingung in so etwas wie "ifelse" verwenden, um einen Wert basierend auf einer Bewertung zuzuweisen. Ich füge die ifelse-Anweisung hinzu, um zu veranschaulichen, wie man mehrere Bedingungen der Nachbarschaft bewerten und eine Matrixpositionsbedingung (Nachbarschaftsnotation) anwenden würde. In dieser Dummy-Funktion ist das Erzwingen von x zu einer Matrix völlig unnötig und dient nur der Veranschaulichung, wie dies geschehen würde. Man kann die Bedingungen für die Nachbarschaftsnotation direkt auf den Vektor anwenden, ohne dass es zu einem Matrixzwang kommt, da die Position im Vektor für seine Position im Fokusfenster gilt und fest bleibt.
Wenden Sie es auf ein Raster an
quelle
Sie können Rasterwerte auf einfache Weise aktualisieren, indem Sie das Raster in [row, col] -Notation unterteilen. Beachten Sie, dass Zeile und Spalte in der oberen linken Ecke des Rasters beginnen. r [1,1] ist der obere linke Pixelindex und r [2,1] ist derjenige unter r [1,1].
quelle