Mam raster wartości:
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)
Jak z tego rastra mogę przypisać wartości (lub zmienić wartości) 8 sąsiednim komórkom bieżącej komórki zgodnie z tą ilustracją? W bieżącej komórce umieściłem czerwony punkt z tej linii kodu:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Tutaj oczekiwany wynik to:
gdzie wartość bieżącej komórki (tj. 5 w rastrze wartości) jest zastępowana przez 0.
Ogólnie nowe wartości dla 8 sąsiednich komórek należy obliczyć w następujący sposób:
Nowa wartość = średnia wartości komórek zawartych w czerwonym prostokącie * odległość między bieżącą komórką (czerwony punkt) a sąsiednią komórką (tj. Sqrt (2) dla sąsiednich komórek po przekątnej lub 1 w innym przypadku)
Aktualizacja
Kiedy granice dla sąsiednich komórek są poza granicami rastra, muszę obliczyć nowe wartości dla sąsiednich komórek, które spełniają warunki. Sąsiednie komórki, które nie spełniają warunków, będą równe „NA”.
Na przykład, jeśli pozycją odniesienia jest c (1,1) zamiast c (5,5) za pomocą notacji [wiersz, kol], można obliczyć tylko nową wartość w prawym dolnym rogu. Zatem oczekiwany wynik to:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Na przykład, jeśli pozycją odniesienia jest c (3,1), można obliczyć tylko nowe wartości w prawym górnym, prawym i prawym dolnym rogu. Zatem oczekiwany wynik to:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Oto moja pierwsza próba focal
zrobienia tego przy użyciu funkcji, ale mam pewne trudności z utworzeniem automatycznego kodu.
Wybierz sąsiednie komórki
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)
jeśli sąsiednia komórka znajduje się w lewym górnym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w górnym środkowym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w lewym górnym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w lewym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w prawym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w lewym dolnym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w środkowym dolnym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w prawym dolnym rogu bieżącej komórki
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
pakiet R ifocal()
funkcję (s. 90 dokumentacji): 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))
. Jak mogę uzyskać wynik tylko dla 8 sąsiednich komórek bieżącej komórki, a nie dla całego rastra? Tutaj, wynik powinien być:res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Wielkie dzięki !Odpowiedzi:
Poniższa funkcja
AssignValuesToAdjacentRasterCells
zwraca nowy obiekt RasterLayer z pożądanymi wartościami przypisanymi z oryginalnego wejścia rastrowego . Funkcja sprawdza, czy sąsiednie komórki z pozycji odniesienia znajdują się w granicach rastra. Wyświetla także komunikaty, jeśli jakieś ograniczenie jest wyłączone. Jeśli musisz przesunąć pozycję referencyjną, możesz po prostu napisać iterację zmieniającą pozycję wejściową na c ( i , j ).Wprowadzanie danych
Funkcjonować
Uruchom przykłady
Przykłady wykresów
Przykład ryciny
Uwaga: średnie
NA
wartości białych krwinekźródło
Dla operatora macierzy na małej macierzy ma to sens i jest wykonalne. Możesz jednak naprawdę przemyśleć swoją logikę, stosując taką funkcję do dużego rastra. Pod względem koncepcyjnym nie jest to tak naprawdę w przypadku ogólnego zastosowania. Mówisz o tym, co tradycyjnie nazywane jest statystyką blokową. Jednak statystyki bloków z natury zaczynają się od jednego rogu rastra i zastępują bloki wartości w określonym rozmiarze okna operatorem. Zwykle ten typ operatora służy do agregowania danych. Byłoby to znacznie łatwiejsze w użyciu, gdybyś pomyślał w kategoriach wykorzystania warunków do obliczenia wartości środkowej macierzy. W ten sposób możesz łatwo użyć funkcji ogniskowej.
Należy pamiętać, że funkcja ogniskowej rastra odczytuje w blokach danych, które reprezentują wartości ogniskowe w zdefiniowanym sąsiedztwie na podstawie macierzy przekazanej do argumentu w. Wynikiem jest wektor dla każdej okolicy, a wynik operatora ogniskowej jest przypisany tylko do komórki ogniskowej, a nie do całej okolicy. Pomyśl o tym, jak chwytanie macierzy otaczającej wartość komórki, działanie na niej, przypisywanie nowej wartości do komórki, a następnie przechodzenie do następnej komórki.
Jeśli upewnisz się, że na.rm = FAŁSZ, to wektor zawsze będzie reprezentował dokładne sąsiedztwo (tj. Ten sam wektor długości) i zostanie przekształcony w obiekt macierzowy, na którym można operować w ramach funkcji. Z tego powodu możesz po prostu napisać funkcję, która pobiera oczekiwany wektor, wymusza matrycę, stosuje logikę notacji sąsiedztwa, a następnie przypisuje pojedynczą wartość jako wynik. Tę funkcję można następnie przekazać do funkcji raster :: focal.
Oto, co dzieje się w każdej komórce na podstawie prostego przymusu i oceny okna ogniskowego. Obiekt „w” byłby zasadniczo taką samą definicją macierzy, jak w przypadku ogniskowej przekazania argumentu w. To określa rozmiar wektora podzbioru w każdej ocenie ogniskowej.
Teraz utwórz funkcję, która może być zastosowana do ogniskowania, stosując powyższą logikę. W takim przypadku możesz przypisać obiekt se jako wartość lub użyć go jako warunku w czymś takim jak „ifelse”, aby przypisać wartość na podstawie oceny. Dodaję instrukcję ifelse, aby zilustrować, w jaki sposób można ocenić wiele warunków sąsiedztwa i zastosować warunek położenia macierzy (notacji sąsiedztwa). W tej funkcji manekina przymus x względem macierzy jest całkowicie niepotrzebny i służy jedynie zilustrowaniu, jak by to było zrobione. Można zastosować warunki notacji sąsiedztwa bezpośrednio do wektora, bez przymusu macierzy, ponieważ pozycja w wektorze dotyczyłaby jego położenia w oknie ogniskowym i pozostała stała.
I zastosuj to do rastra
źródło
Możesz łatwo zaktualizować wartości rastra, zastępując raster za pomocą notacji [row, col]. Zauważ, że rząd i kolumna zaczynają się od lewego górnego rogu rastra; r [1,1] to wskaźnik lewego górnego piksela, a r [2,1] to ten pod r [1,1].
źródło