我正在尝试通过使用薄板样条算法生成英国的网格化降雨数据,并消除 R 中不在陆地上的值——到目前为止,我只能手动实现这一过程。这个问题(对我来说)具有挑战性,甚至难以解释——所以我将逐步介绍我到目前为止所做的事情。非常欢迎任何帮助。
首先,我将一个数据表加载到 R 中,该数据表表示来自多个点位置气象站的单日降雨量,数据表的每一行包含日期、站点 ID、站点东移和北移、该地点的日降雨量和全年平均降雨量。我还加载了库字段、maptools 和 gstat。
library(fields)
library(maptools)
library(gstat)
dat <- read.table("1961month1day1.csv", header=T, sep=",", quote = "")
names(dat) <- c("easting", "northing", "dailyrainfall","avaerageyearlyrainfall")
以下是数据示例:
dput(head(dat, 20))
structure(list(easting = c(130000L, 145000L, 155000L, 170000L,
180000L, 180000L, 180000L, 180000L, 185000L, 200000L, 200000L,
205000L, 210000L, 220000L, 225000L, 230000L, 230000L, 230000L,
230000L, 235000L), northing = c(660000L, 30000L, 735000L, 40000L,
30000L, 45000L, 60000L, 750000L, 725000L, 50000L, 845000L, 65000L,
770000L, 105000L, 670000L, 100000L, 620000L, 680000L, 95000L,
120000L), dailyrainfall = c(9.4, 4.1, 12.4, 2.8, 1.3, 3.6, 4.8, 26.7, 19.8,
4.6, 1.7, 4.1, 12.7, 1.8, 3, 5.3, 1, 1.5, 1.5, 4.6), averageyearlyrainfall = c(1334.626923,
1123.051923, 2072.030769, 1207.584615, 928, 1089.334615, 880.0884615,
2810.323077, 1933.719231, 1215.642308, 2644.171154, 1235.913462,
2140.111538, 1010.436538, 1778.432692, 1116.934615, 912.2807692,
1579.386538, 1085.498077, 1250.601923)), .Names = c("easting",
"northing", "dailyrainfall", "averageyearlyrainfall"), row.names = c(NA, 20L), class = "data.frame")
然后我可以将薄板样条拟合到数据中,以便给我一个网格表面并绘制表面:
fit <- Tps(cbind(dat$easting,dat$northing),dat$dailyrainfall)
surface(fit)
然后,我可以使用以下方法以 1 公里的步长创建英国的网格:
xvals <- seq(0, 700000, by=1000)
yvals <- seq(0, 1250000, by=1000)
然后将曲面绘制到该网格上并将数据写入表中:
griddf <- expand.grid(xvals, yvals)
griddf$pred <- predict(fit, x=as.matrix(griddf))
write.table(griddf, file="1Jan1961grid.csv", sep=",", qmethod="double")
太好了——到目前为止一切都很好。我现在已经将我的点数据转换为 0 到 700000 (E) 和 0 到 1250000 (N) 整个网格的 1 公里网格数据。书面数据表是一个包含索引、东距、北距和预测降雨量值的列表。
现在是挑战 - 我想从这个列表中消除任何不在陆地上的值。我可以通过将数据加载到 excel(或 Access)中并将数据与另一个包含相同网格和平均年降雨量的文件(该文件称为 1kmgridaveragerainfall.csv)进行比较来手动实现这一点。这是此文件的示例:
dput(head(dat1, 20))
structure(list(easting = c(-200000L, -200000L, -200000L, -200000L,
-200000L, -200000L, -200000L, -200000L, -200000L, -200000L, -200000L,
-200000L, -200000L, -200000L, -200000L, -200000L, -200000L, -200000L,
-200000L, -200000L), northing = c(1245000L, 1240000L, 1235000L,
1230000L, 1225000L, 1220000L, 1215000L, 1210000L, 1205000L, 1200000L,
1195000L, 1190000L, 1185000L, 1180000L, 1175000L, 1170000L, 1165000L,
1160000L, 1155000L, 1150000L), averageyearlyrainfall = c(-9999, -9999, -9999,
-9999, -9999, -9999, -9999, -9999, -9999, -9999, -9999, -9999,
-9999, -9999, -9999, -9999, -9999, -9999, -9999, -9999)), .Names = c("easting",
"northing", "averageyearlyrainfall"), row.names = c(NA, 20L), class = "data.frame")
任何不超过陆地的方格网的年平均降雨量为 -9999。因此,一旦匹配(即使用 vlookup 或 Access 中的查询),我可以过滤掉具有 -9999 值的值,这给我留下了一个数据表,其中仅包含土地价值的东向和北向以及每日降雨量和年平均降雨量。然后我可以将它加载回 R 并使用以下方法绘制它:
quilt.plot(cbind(dat$easting,dat$northing),dat$mm, add.legend=TRUE, nx=654, ny=1209,xlim=c(0,700000),ylim=c(0,1200000))
我在英国陆地(而不是海域)上留下了一块降雨。
那么,任何人都可以提出一种实现相同但没有使用excel或访问的所有过滤等的方法,即只能使用R来实现相同的目标吗?有没有办法在开始时将两个数据表都加载到 R 中,并以某种方式将点数据的 TPS 拟合到平均数据上,以便不绘制等于 -9999 的网格正方形。
我知道可以使用协变量 (Z) 对 TPS 进行加权——这有帮助吗?IE
fit <- Tps(cbind(dat$easting,dat$northing),dat$dailyrainfall, Z=dat$averageyearlyrainfall)
另外,当我执行原始 TPS 的表面(拟合)时,如何将绘图扩展到绘图的边缘 - 我确定我已经在某个地方读过这个,你在其中放置了 interp=TRUE 之类的东西,但这并没有工作。
非常感激任何的帮助
谢谢,托尼