我有一张印度的基本地图,其中包含州和边界、一些标签以及作为 gg 对象存储的许多其他规范。我想生成许多带有地区图层的地图,这些地图将承载来自不同变量的数据。
为了防止地区地图覆盖州和国家边界,它必须在所有以前的代码之前,我想避免重复。
我想我可以通过$layers根据这个答案调用gg 对象来做到这一点。但是,它会引发错误。Reprex 如下:
library(ggplot2)
library(sf)
library(raster)
# Download district and state data (should be less than 10 Mb in total)
distSF <- st_as_sf(getData("GADM",country="IND",level=2))
stateSF <- st_as_sf(getData("GADM",country="IND",level=1))
# Add border
countryborder <- st_union(stateSF)
# Basic plot
basicIndia <- ggplot() +
geom_sf(data = stateSF, color = "white", fill = NA) +
geom_sf(data = countryborder, color = "blue", fill = NA) +
theme_dark()
basicIndia
Run Code Online (Sandbox Code Playgroud)

# Data-bearing plot
districts <- ggplot() +
geom_sf(data = …Run Code Online (Sandbox Code Playgroud) 我经常遇到一个问题,即在连接后合并重复列的非 NA 值并删除重复项。它类似于这个问题或这个问题中所描述的内容。我想围绕coalesce(并可能包括left_join)创建一个小函数,以便在遇到它时在一行中处理它(函数本身当然可以根据需要长度)。
这样做时,我遇到了缺乏此处描述的quo_names等效内容的情况。quos
对于 reprex,采用带有识别信息的数据帧,与包含正确值但经常拼写错误的 ID 的其他数据帧连接。
library(dplyr)
library(rlang)
iris_identifiers <- iris %>%
select(contains("Petal"), Species)
iris_alt_name1 <- iris %>%
mutate(Species = recode(Species, "setosa" = "stosa"))
iris_alt_name2 <- iris %>%
mutate(Species = recode(Species, "versicolor" = "verscolor"))
Run Code Online (Sandbox Code Playgroud)
这个更简单的函数可以工作:
replace_xy <- function(df, var) {
x_var <- paste0(var, ".x")
y_var <- paste0(var, ".y")
df %>%
mutate(!! quo_name(var) := coalesce(!! sym(x_var), !! sym(y_var))) %>%
select(-(!! sym(x_var)), -(!! sym(y_var)))
}
iris_full <- …Run Code Online (Sandbox Code Playgroud) 这个问题stringr::str_replace_all可能在有这个选项之前(或者众所周知)寻求类似的答案。我正在复制下面我的答案的要点,使用str_replace_all.
tr <- c("whatevs_1", "something_52", "whatevs_1something_52")
tr
#> [1] "whatevs_1" "something_52" "whatevs_1something_52"
patterns <- sprintf('_%s$', c('1','14','22','50','52','57','76','1018','2001','3301','6005'))
replacements <- sprintf('_%s' , c('R','I', 'P', 'O', 'C', 'D', 'M', 'L', 'S', 'K', 'G'))
names(replacements) <- patterns
stringr::str_replace_all(tr, replacements)
#> [1] "whatevs_R" "something_C" "whatevs_1something_C"
Run Code Online (Sandbox Code Playgroud)
您将如何在 R 基础上实现上述目标?
提供的最佳选择是 for 循环。只是想知道是否有人同时想到了更好的选择。