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

时间:2018-06-18 10:02:46

标签: r ascii raster coordinate

我在ASCII文件中读取了与UK坐标网格对应的值,但是,如果我想应用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种不同的空气质量化学测量,所以如果有一个代码,它将使我的生活更轻松。任何帮助表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:1)

如果我理解你需要什么:

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

答案 1 :(得分:0)

以下是两种更传统的方法(与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))