问题描述
我正在R
中使用常规数据帧(df
)和shapefile(map2
),它们共享一个称为CD116FP
的公用列。 df
有103552行,而map2
有444行。我通过以下方式加载shapefile:
map2
我的最终目标是使用函数mapview()
来查看map2
在列df
下描述的“强度”下包含在np_scores
中的地图。 。因此,我不希望df
上没有出现的map2
观测结果。
这是我的想法和失败:
map2m
但是结果的尺寸太大(远大于444行),因此mapview
在尝试绘制所需的地图时崩溃。
map2
但是,鉴于我的数据框的尺寸,这种方法只会花费太多时间。
您有什么建议吗?
解决方法
您的数据结构让我有些困惑。您的df
具有超过100,000行,因此我猜想同一CD116FP
在df
中会出现多次,并且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
的行数与您的数据相同,以表明此解决方案可以解决您的问题。
我们将npscores
与dplyr
进行汇总:
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-09-19创建
,我使用基本软件包中的旧merge
运气不错。这是我自己的作品的摘录,如果这对您来说很有价值:-)
my_data <- read_excel("TraderDataRaw.xlsx",sheet = "fsa",col_types= c("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","PRNAME"))