矩阵版本的rasterToPoints?

时间:2015-11-26 16:52:12

标签: r matrix

任何人都知道要实现以下目标的非光栅方法吗?

require(raster)
d = data.frame(rasterToPoints(raster(volcano)))
head(d)
            x         y layer
1 0.008196721 0.9942529   100
2 0.024590164 0.9942529   100
3 0.040983607 0.9942529   101
4 0.057377049 0.9942529   101
5 0.073770492 0.9942529   101
6 0.090163934 0.9942529   101

干杯。

2 个答案:

答案 0 :(得分:2)

一种方法是使用rowcol命令:

library(raster)
data(volcano)

df <- data.frame(
  x = as.vector(col(volcano)), 
  y = (yy <- as.vector(row(volcano)))[length(yy):1],
  val = as.vector(volcano)
)

raster将范围重新调整为0 - 1,如果没有另外指定,那么我们也必须这样做:

## rescale
df$x <- with(df, (x - min(x)) / (max(x) - min(x)))
df$y <- with(df, (y - min(x)) / (max(y) - min(y)))

最后让我们检查结果是否相同:

 ## Using raster df1 <- data.frame(rasterToPoints(raster(volcano)))

 cols <- colorRampPalette(c('white', "blue",'red')) df$col <-
 cols(20)[as.numeric(cut(df$val, breaks = 20))] df1$col <-
 cols(20)[as.numeric(cut(df1$layer, breaks = 20))]

 par(mfrow = c(1, 2)) plot(df[, 1:2], col = df$col, pch = 20, main =
 "matrix")

 plot(df1[, 1:2], col = df1$col, pch = 20, main = "raster")

enter image description here

注意:

虽然结果在视觉上看起来相同,但它们raster命令的分辨率很可能不同,因此nrowdfdf1个不同。

答案 1 :(得分:1)

大型矩阵更快:

data.frame(
  x = rep(1:ncol(m), each=nrow(m)), 
  y = rep(nrow(m):1, ncol(m)),
  val = as.vector(m)
)