2017-03-01 3 views
3

Ich habe Datensatz, die Positionen der Objekte enthalten:Detect äußeren Reihen im Datensatz

so <- data.frame(x = rep(c(1:5), each = 5), y = rep(1:5, 5)) 
so1 <- so %>% mutate(x = x + 5, y = y +2) 
so2 <- rbind(so, so1) %>% mutate(x = x + 13, y = y + 7) 
so3 <- so2 %>% mutate(x = x + 10) 
ggplot(aes(x = x, y = y), data = rbind(so, so1, so2, so3)) + geom_point() 

Was ich wissen will, ist, wenn es ein Verfahren, in R ist die, dass das Objekt erkennen kann, in der Lage ist, äußere Reihe im Datensatz, da ich solche Objekte von der Analyse ausschließen muss. Ich möchte die Objekte in rot wie auf dem Bild verwendete ich min enter image description here

Bisher auszuschließen, max und ifelse aber das ist tidious und ich konnte nicht etwas schaffen, die zu den verschiedenen Datensätzen mit unterschiedlichen Design verallgemeinert werden könnte von x und y. Gibt es package, die das Ding tun? oder/und ist es möglich, ein solches Problem zu lösen?

Antwort

4

Sie könnten vielleicht einen "räumlichen" Ansatz verwenden? Ihre Daten als räumliches Objekt sichtbar machen, Ihr Problem, die Grenzen Ihres Patches entfernen würde ...

Dies kann ganz unkompliziert das Paket raster Verwendung erfolgen: entsprechend die boundaries und mask Ihre Daten.

library(dplyr) 
library(raster) 

# Your reproducible example 
myDF = rbind(so,so1,so2,so3) 
myDF$z = 1 # there may actually be more 'z' variables 

# Rasterize your data 
r = rasterFromXYZ(myDF) # if there are more vars, this will be a RasterBrick 
par(mfrow=c(2,2)) 
plot(r, main='Original data') 

# Here I artificially add 1 row above and down and 1 column left and right, 
# This is a trick needed to make sure to also remove the cells that are 
# located at the border of your raster with `boundaries` in the next step. 
newextent = extent(r) + c(-res(r)[1], res(r)[1], -res(r)[2], res(r)[2]) 
r = extend(r, newextent) 
plot(r, main='Artificially extended') 
plot(rasterToPoints(r, spatial=T), add=T, col='blue', pch=20, cex=0.3) 

# Get the cells to remove, i.e. the boundaries 
bounds = boundaries(r[[1]], asNA=T) #[[1]]: in case r is a RasterBrick 
plot(bounds, main='Cells to remove (where 1)') 
plot(rasterToPoints(bounds, spatial=T), add=T, col='red', pch=20, cex=0.3) 

# Then mask your data (i.e. subset to remove boundaries) 
subr = mask(r, bounds, maskvalue=1) 
plot(subr, main='Resulting data') 
plot(rasterToPoints(subr, spatial=T), add=T, col='blue', pch=20, cex=0.3) 

# This is your new data (the added NA's are not translated so it's OK) 
myDF2 = rasterToPoints(subr) 

enter image description here

Würde es Ihnen helfen?

+0

Ich denke, Sie können keine andere Variable im Datenrahmen haben, die Sie rastern möchten? nur x und y? – Mateusz1981

+0

Eigentlich könnte man ja viele Variablen haben :-) 'RasterFromXYZ' würde dann einen' RasterBrick' erzeugen (d. H. Ein mehrschichtiges Raster mit einer Ebene pro Variable in Ihrem data.frame). Der einzige Unterschied besteht darin, dass Sie "Grenzen = Grenzen (r [[1]], wie NA = T)" brauchen, da "Grenzen" für einen "RasterBrick" nicht funktionieren (wählen Sie also die erste Ebene, die bearbeitet werden soll) es - das bedeutet, dass alle Ihre Variablen die gleiche räumliche Verteilung haben müssen). Ich habe die Antwort entsprechend bearbeitet: Sie sollte nun für jeden Fall gültig sein (1 oder mehr Variablen). – ztl

Verwandte Themen