将坐标 ASC 文件(栅格数据)转换为 XY 坐标数据框

Converting coordinate ASC file (raster data) into a XY coordinate data frame

我读入了一个 ASCII 文件,其中的值对应于英国坐标网格,但是,如果我想应用 which.closest() 命令,我需要能够根据以下内容指定列X 和 Y 坐标。所以现在,下面是我拥有的数据框类型的随机示例摘录:

           1000 2000 3000 4000 5000
    66000     1    2    3    4    5
    65000     1    2    3    4    5
    64000     1    2    3    4    5
    63000     1    2    3    4    5
    62000     1    2    3    4    5

这是脚本,您可以重现此摘录:

    a=c(1,1,1,1,1)
    b=c(2,2,2,2,2)
    c=c(3,3,3,3,3)
    d=c(4,4,4,4,4)
    e=c(5,5,5,5,5)
    df=data.frame(a,b,c,d,e)
    colnames_df=seq(1000,5000,1000)
    rownames_df=seq(62000,66000,1000)
    rownames_df=rev(rownames_df)
    colnames(df)=colnames_df
    rownames(df)=rownames_df
    df

这是我希望能够继续分析的数据框:

    X     Y      Z
    1000  62000  1
    1000  63000  1
    3000  64000  1
    1000  65000  1
    1000  66000  1
    2000  62000  2
    2000  63000  2
    2000  64000  2
    2000  65000  2
    2000  66000  2 
    ...(etc.)

是否有代码可以轻松完成此操作而不是手动设置新数据框、指定列和行等,因为我有一个数据框 1377 x 812 用于 20 种不同的空气质量化学测量,所以如果有一个代码可以让我的生活更轻松。任何帮助表示赞赏!谢谢!

如果我理解正确的话:

library(dplyr)
library(tidyr)
df <- cbind(Y = rownames(df), df)
rownames(df) <- NULL
df <- df %>% gather(X, Z, -Y)

这里有两种更传统的方法(与 Thor6 建议的 gather 相比):

X <- as.integer(rep(colnames(df), each=nrow(df)))
Y <- as.integer(rep(rownames(df), nrow(df)))
a <- cbind(X, Y, Z = as.vector(as.matrix(df)))

reshape(相当复杂)

cn <- colnames(df)
b <- reshape(df, direction='long', varying=cn, v.names = "Z", times=cn, timevar = "X" )
b$Y <- rownames(df)
b <- b[, c('X', 'Y', 'Z')]
rownames(b) <- NULL

但是,鉴于这些是栅格数据,如果它们以标准文件格式存储,则您不需要首先制作 data.frame,您可以这样做:

library(raster)
r <- raster('raster data file')
d <- rasterToPoints(r) 

如果您还想要 NA

的单元格
e <- cbind(xyFromCell(r, 1:ncell(r)), Z=values(r))

工作示例

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
d <- rasterToPoints(r) 
e <- cbind(xyFromCell(r, 1:ncell(r)), Z=values(r))