提问人:Fish_Person 提问时间:11/2/2022 最后编辑:Fish_Person 更新时间:11/2/2022 访问量:62
R 中二维数组中的条件切片
Conditional slicing in a 2-dimensional array in R
问:
我有一个由纬度(维度 1)和经度(维度 2)坐标组成的二维数组。每对纬度坐标的位置对应于温度数据的三维数组(表示深度的第三维)中的一个位置。
我想提取纬度坐标的位置,使纬度值为 60<纬度<70 和 -60<经<-50,以便将它们与温度数组相关联并提取特定区域的温度数据。我是 R 和一般编程的新手,所以这对我来说是一个很大的问题。
#Extracts latitude and longitude matrices into variables
nav_lat <- ncvar_get(nc,"nav_lat")
nav_long <- ncvar_get(nc,"nav_lon")
#Overlays lat and long matrices to create pairs
nav_latlong <- array(c(nav_lat,nav_long),dim=(c(1442,398,2)))
region <- filter(nav_latlong,between(60,70) & between(-60,-50))
这就是你所说的一个小的可重复的例子吗?
library(tidyverse)
vector_1 <- c(5,9,3)
vector_2 <- c(10,11,12)
result <- array(c(vector_1,vector_2),dim=c(3,3,2))
region <- filter(result,between(result[,,1],5,10) & between(result[,,2],10,12))
所以在这里,我想提取第一个元素在 5 到 10 之间,第二个元素在 10 到 12 之间。
答:
0赞
AndS.
11/2/2022
#1
这是另一种选择:
#example
set.seed(1)
lat <- matrix(runif(9, 50, 80), nrow = 3)
long <- matrix(runif(9, -70, -50), nrow = 3)
latlong <- array(c(lat, long), dim = c(3,3,2))
latlong
#> , , 1
#>
#> [,1] [,2] [,3]
#> [1,] 57.96526 77.24623 78.34026
#> [2,] 61.16372 56.05046 69.82393
#> [3,] 67.18560 76.95169 68.87342
#>
#> , , 2
#>
#> [,1] [,2] [,3]
#> [1,] -68.76427 -56.25954 -60.04602
#> [2,] -65.88051 -62.31793 -55.64763
#> [3,] -66.46886 -54.60317 -50.16188
#create filter mask
mask <- array(dim = c(3,3,2))
mask[,,1] <- dplyr::between(latlong[,,1], 60, 70)
mask[,,2] <- dplyr::between(latlong[,,2], -60, -50)
mask <- mask[,,1] & mask[,,2]
mask
#> [,1] [,2] [,3]
#> [1,] FALSE FALSE FALSE
#> [2,] FALSE FALSE TRUE
#> [3,] FALSE FALSE TRUE
#apply mask to get lat long pairs
apply(latlong, 3, \(x) x[mask])
#> [,1] [,2]
#> [1,] 69.82393 -55.64763
#> [2,] 68.87342 -50.16188
编辑 萃取温度
如果想知道原始数组中 lat long 的索引,可以使用 。你不需要,因为已经是逻辑的(即 TRUE 和 FALSE 的矩阵)。或者,您可以将掩模应用于温度矩阵(假设其尺寸相同)。见下文。which(mask, arr.ind = TRUE)
mask == TRUE
mask
#temperature example
set.seed(32)
temperatures <- matrix(runif(9, -20, 20), nrow = 3)
temperatures
#> [,1] [,2] [,3]
#> [1,] 0.2336209 9.152789 10.141508
#> [2,] 3.7923355 -13.920497 14.082492
#> [3,] 12.3498853 18.247490 6.937671
#get the temperatures
temperatures[mask]
#> [1] 14.082492 6.937671
或者更好的是将温度添加到纬度长数组中并一次提取所有内容,这样您就有了一个不错的数据输出:
all_data <- abind::abind(latlong, temperatures, along = 3)
all_data
#> , , 1
#>
#> [,1] [,2] [,3]
#> [1,] 57.96526 77.24623 78.34026
#> [2,] 61.16372 56.05046 69.82393
#> [3,] 67.18560 76.95169 68.87342
#>
#> , , 2
#>
#> [,1] [,2] [,3]
#> [1,] -68.76427 -56.25954 -60.04602
#> [2,] -65.88051 -62.31793 -55.64763
#> [3,] -66.46886 -54.60317 -50.16188
#>
#> , , 3
#>
#> [,1] [,2] [,3]
#> [1,] 0.2336209 9.152789 10.141508
#> [2,] 3.7923355 -13.920497 14.082492
#> [3,] 12.3498853 18.247490 6.937671
#get lat long and temperature
apply(all_data, 3, \(x) x[mask]) |>
`colnames<-`(c("Lat", "Long", "Temperature"))
#> Lat Long Temperature
#> [1,] 69.82393 -55.64763 14.082492
#> [2,] 68.87342 -50.16188 6.937671
评论
0赞
AndS.
11/2/2022
PS 我在您添加示例之前写了这个,所以我的答案与您的示例数据不匹配。
0赞
Fish_Person
11/2/2022
你的答案看起来很棒。我可能比你们中的一些人年纪大一点,所以速度慢一点。我会花一些时间看一下这段代码 - 谢谢:)
0赞
AndS.
11/2/2022
不用担心,我完全理解。这里的关键是获得正确的索引。如果您需要任何澄清,请告诉我。
0赞
AndS.
11/2/2022
此外,作为一个经常使用温度数据的人,我建议查看 、 和 包。他们在处理和处理 R 中的空间数据方面做得非常好。raster
stars
sf
0赞
Fish_Person
11/2/2022
您的代码运行良好,谢谢。现在,我将如何返回这些对在原始矩阵中的位置,而不是坐标本身?我想我想返回掩码中“TRUE”元素的所有位置。像这样的东西(mask == TRUE, arr.ind = TRUE)会起作用吗?最好的,F。
评论