我在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种不同的空气质量化学测量,所以如果有一个代码,它将使我的生活更轻松。任何帮助表示赞赏!谢谢!
答案 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))