r语言 - 按id将空间特征与格式不一致的dataframe连接



大家好,我希望我能得到一些帮助在这个问题上:

我有2347个特征对应于3172个单位的shapefile,也许当原始文件被创建时,有一些重复的几何形状,他们决定这样安排它们:

Feature gis_id
1        "1"     
2        "2"     
3       "3,4,5"
4        "6,8"     
5        "7"     
6       "9,10,13" 

…直到3172个单元和2347个功能

在另一边,我的数据表有72956个观测值(大约16列),数据对应于来自shapefile的gis_id。但是,对于每个观测值,该表有一个唯一的gis_id

head(hru_ls)
jday  mon  day   yr  unit  gis_id    name  sedyld   tha sedorgn   kgha sedorgp   kgha surqno3   kgha lat3no3   kgha
1   365   12   31 1993     1       1 hru0001        0.065          0.861          0.171          0.095              0
2   365   12   31 1993     2       2 hru0002        0.111          1.423          0.122          0.233              0
3   365   12   31 1993     3       3 hru0003        0.024          0.186          0.016          0.071              0
4   365   12   31 1993     4       4 hru0004        6.686         16.298          1.040          0.012              0
5   365   12   31 1993     5       5 hru0005       37.220        114.683          6.740          0.191              0
6   365   12   31 1993     6       6 hru0006        6.597         30.949          1.856          0.021              0
surqsolp   kgha usle   tons sedmin   ---- tileno3   ----
1           0.137           0         0.010              0
2           0.041           0         0.009              0
3           0.014           0         0.001              0
4           0.000           0         0.175              0
5           0.000           0         0.700              0
6           0.000           0         0.227              0

每个单元有多个记录(20年数据)

我想合并我的shapefile的几何数据到我的数据表。我以前用sp::merge做过这件事,我想,但是有一个shapefile,没有多个id的每个几何/特征。

是否有一种方法来条件合并,所以它给出了每个特征从数据表相应的几何根据它是否有任何值存在于gis_id字段从shapefile?

这是一个非常有趣的问题,所以我试了一下。我的答案可能不是最快或最简洁的方法,但它是有效的(至少对于您的示例数据)。注意,这种方法对shapefile$gis_id中的数据格式相当敏感(参见regex)。

# your spatial data
shapefile <- data.frame(feature = 1:6, gis_id = c("1", "2", "3,4,5", "6,8", "7", "9,10,13"))
# your tabular data
hru_ls <- data.frame(unit = 1:6, gis_id = paste(1:6))
# loop over all gis_ids in your tabular data
# perhaps this could be vectorized?
gis_ids <- unique(hru_ls$gis_id)
for(id in gis_ids){
# Define regex to match gis_ids
id_regex <- paste0("(,|^)", id, "(,|$)")
# Get row in shapefile that matches regex
searchterm <- lapply(shapefile$gis_id, function(x) grepl(pattern = id_regex, x = x))
rowmatch <- which(searchterm == TRUE)
# Return shapefile feature id that maches tabular gis_id
hru_ls[hru_ls$gis_id == id, "gis_feature_id"] <- shapefile[rowmatch, "feature"]
}

由于你的问题中没有提供几何字段,我只是在你的空间数据中匹配了Feature。您可以添加一个基于Feature合并的额外步骤,或者用您的几何字段替换shapefile[rowmatch, "feature"]中的"feature"

相关内容

  • 没有找到相关文章

最新更新