【问题标题】:Merging a Shapefile and a dataframe合并 Shapefile 和数据框
【发布时间】:2020-09-17 16:50:51
【问题描述】:

我在R 中使用常规数据框 (df) 和 shapefile (map2),共享一个名为 CD116FP 的公共列。 df 有 103552 行,而 map2 有 444 行。我正在通过以下方式加载 shapefile:

map2

我的最终目标是使用函数mapview() 来查看包含在map2 中的地图,其“强度”在dfnp_scores 下描述。因此,我不希望看到df 上没有出现在map2 上。

以下是我的想法和失败:

  1. 如果这两个对象是常规数据帧,一个合理的选择是使用merge() 来组合这两个对象,但是如果在这种情况下应用该函数,生成的对象会失去空间属性并且mapview 不知道怎么读。

  2. 我使用的另一种方法是尝试这行代码:

map2m

但结果的尺寸太大(远大于 444 行),因此在尝试绘制所需地图时 mapview 崩溃。

  1. 最后,我全力以赴,构建了一个循环,将np 列添加到map2
map2$np=10

for (i in c(1:nrow(map2)))
{  
for (j in c(1:nrow(df)))
 {
if (identical(map2$CD116FP[i],df$CD116FP[j]))
{map2$np[i]=df$np_score[j]}
else {map2$np[i]=0}  
}
}  

但是,考虑到我的数据框的尺寸,这种方法会花费太多时间。

你有什么建议吗?

【问题讨论】:

标签: r merge shapefile r-mapview


【解决方案1】:

我对您的数据结构感到有些困惑。您的 df 有超过 100,000 行,所以我猜测相同的 CD116FPdf 中多次出现,而 npscore 可能会因这些实例而异。如果您想将这些合并到map2,您需要先聚合它们。

让我们尝试重新创建一个类似的设置:

library(sf)
#> Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1

map2 <- read_sf("C:/users/administrator/documents/shape/tl_2019_us_cd116.shp")

set.seed(69)

df <- data.frame(CD116FP = sprintf("%02d", sample(0:99, 103552, TRUE)),
                 npscores = runif(103552))

head(df)
#>   CD116FP  npscores
#> 1      95 0.6927742
#> 2      80 0.8543845
#> 3      90 0.5220353
#> 4      01 0.1449647
#> 5      76 0.9876543
#> 6      38 0.5629950

我已使 df 具有与您的数据相同的行数,以显示此解决方案将扩展到您的问题。

让我们将npscoresdplyr 聚合起来:

library(dplyr)
df_sum <- df %>% 
  filter(CD116FP %in% map2$CD116FP) %>%
  group_by(CD116FP) %>%
  summarise(npscores = mean(npscores))

map2$npscores <- df_sum$npscores[match(map2$CD116FP, df_sum$CD116FP)]

现在map2 具有我们可以绘制的聚合npscores - 例如,在 ggplot 中:

library(ggplot2)

ggplot(map2) + 
  geom_sf(aes(fill = npscores)) +
  coord_sf(xlim = c(-180, -60),
            ylim = c(15, 70)) +
  scale_fill_gradient(low = "red", high = "gold")

或者在地图视图中:

library(mapview)
mapView(map2, zcol = "npscores")

reprex package (v0.3.0) 于 2020 年 9 月 19 日创建

【讨论】:

  • 谢谢! dplyr 的正确用户是我所需要的。一个额外的问题,在 ggplot 中绘图时如何处理 npsocres 中可能的 NA?
  • 其实这似乎不是NA的问题。我使用 mapView 得到了正确的绘图,但使用 ggplot 我得到以下消息:“为 FUN 中的每个多边形错误定义的区域(X [[i]],...):找不到对象'np_score'”
  • 我在我的代码中使用npscores - 只需检查名称是否一致@WeierstraßRamirez
  • 是的,我注意到了。我相应地在我的代码中对其进行了调整,但得到了同样的错误。
  • @WeierstraßRamirez 如果您的绘图代码包含一个名为 np_score 的变量,您只会收到该错误。那是从哪里来的? map2 中的列名是什么?
【解决方案2】:

我很幸运地使用了基础包中的普通旧 merge。如果这对您有价值的话,这是我自己的工作的摘录:-)

my_data <- read_excel("TraderDataRaw.xlsx", 
      sheet = "fsa", 
      col_types= c("text","text","text","logical","numeric","numeric")) %>% 
      mutate(resp_rate=mailed/responses)

my_map <- st_read("lfsa000b16a_e.shp", stringsAsFactors = FALSE) 

my_merged_data <- merge(my_map, my_data, 
      by.x=c("CFSAUID","PRUID","PRNAME"), 
      by.y=c("CFSAUID","PRUID","PRNAME"))

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2021-03-20
    相关资源
    最近更新 更多