小编Fon*_* MA的帖子

在现有 geom_sf 图层下方插入 geom_sf 图层

我有一张印度的基本地图,其中包含州和边界、一些标签以及作为 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)

r ggplot2 r-sf

3
推荐指数
1
解决办法
1831
查看次数

使用变量名称向量在 left_join 之后合并重复变量

我经常遇到一个问题,即在连接后合并重复列的非 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)

r dplyr tidyeval

3
推荐指数
1
解决办法
882
查看次数

stringr::str_replace_all 的基本 R 替代方案,带有 c(pattern1 = replacement1) 选项

这个问题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 循环。只是想知道是否有人同时想到了更好的选择。

regex r stringr

2
推荐指数
1
解决办法
499
查看次数

标签 统计

r ×3

dplyr ×1

ggplot2 ×1

r-sf ×1

regex ×1

stringr ×1

tidyeval ×1