r - 使用 map (purrr) 迭代 R 中的两个向量

标签 r function purrr

我正在尝试在多个都市区绘制三个不同因变量(每个单独绘制)的 map 。为此,我正在尝试制作 2 个嵌套 map 。我首先在一个都市区的 3 个不同变量上执行此操作 - 定义函数并通过 map 运行它并且它可以工作。这部分的代码如下:

plot_fun <- function(x){
  base_plot_2015$`14460` +
  data_2015 %>% subset(met2013 == 14460) %>% subset(onetsoccode == "151021") %>% 
    geom_sf(mapping = aes_string(fill = x)) +
    scale_fill_viridis_c(option = "plasma") 
}

expl <- names(data_2015)[17:19]
expl <- set_names(expl)

plot_Boston <- map(expl, ~plot_fun(.x))

这给了我 3 张 map 的列表,到目前为止还不错。 (请注意,base_plot 是一个列表,其中包含保存为都市地区 ID 的每个都市地区的 map ,该 ID 以 double 形式存储)。

接下来,我想做同样的事情,但还要在不同的地铁代码上进行迭代。我尝试通过定义以下函数来做到这一点:
plot_fun <- function(x,y){
  base_plot_2015$`y` +
    data_2015 %>% subset(met2013 == y) %>% subset(onetsoccode == "151021") %>% 
    geom_sf(mapping = aes_string(fill = x)) +
    scale_fill_viridis_c(option = "plasma") 
}

这个想法是将它映射到要绘制的每个因变量(x)的都会区向量(y)上。但是,在我这样做之前,我无法使此功能正常工作。当我使用 plot_fun("work_home", 14460) 运行此函数时,我收到以下错误:

base_plot_2015$y + data_2015 %>% 子集(met2013 == y)%>% 子集(onesoccode == )中的错误:
二元运算符的非数字参数


有人会友好地指出我在这里做错了什么吗?

此外,要进行嵌套映射,代码 map(met, ~map(expl, ~plot_fun, y=.x)) (其中met 是都市区域代码的向量)有意义吗?

最佳答案

TLDR:当您对 base_plot 列表进行子集化时,您需要使用 [[运算符而不是 $
在您的第二个版本中,该函数将其视为字符串“y”,而不是变量 y .因为大概没有地铁代码“y”,NULL被退回。二元运算符是 +NULL是非数字的。这是正在发生的事情的简化示例:

base_data <- list(
  a = letters,
  b = LETTERS,
  c = rnorm(100)
)

getMyData <- function(y){
  base_data$`x`
} 

getMyData("a")
#> NULL

base_data$x <- "QSBjbHVlIHBlcmhhcHM="

val <- getMyData("a") %>% print()
#> [1] "QSBjbHVlIHBlcmhhcHM="

base64enc::base64decode(val) %>% rawToChar()
#> [1] "A clue perhaps"

如果您将函数更改为使用 [[运算符,您可以使用变量 y 中的字符串值子集:
actuallyGetMyData <- function(x){
  base_data[[x]]
}

actuallyGetMyData("a")[1:10]
#> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

编辑 :关于排列上的映射(因为很难阅读注释中的代码)

电话map(expl, ~plot_fun)创建一个匿名函数,返回函数 plot_fun .您要么需要删除匿名函数
map(met, ~map(expl, plot_fun, y=.x))

或调用函数
map(met, ~map(expl, ~plot_fun(.x, .y), .y=.x))

我发现嵌套映射有点难以阅读(.x 变成 .y 什么不是)所以或者你可以先枚举所有组合,然后映射那些
plotVars <- expand.grid(expl, met)
plot_final <- map2(plotVars[[1]], plotsVars[[2]],  plot_fun) %>% 
  set_names(paste(plotVars[[1]], plotVars[[2]], sep = "_"))

请注意您的 plot_final列表将不再嵌套。

关于r - 使用 map (purrr) 迭代 R 中的两个向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60675924/

相关文章:

r - 在 R 的 "contains"包中找不到 "purrr"函数

mysql - 数据仓库 - 如何使用 R 和/或 SQL 创建与所有维度相交的事实表

r - 如何在分组数据框上使用 dplyr::across 和多参数函数?

r - 如何使用不同条件评估 data.table 中的列

r - 如何快速对具有相同 stub 名称的多个列进行排序?

改变指针指向的int变量

algorithm - 在 int 中找到第 n 个 SET 位

string - 转换十六进制字符串的问题(在 Lua 中)

r - 将 mutate(across(...)) 与 purrr::map 结合使用

r - 使用 purrr :map 将函数应用于 R 中列表的每个元素