我试图将data.frame中的一组变量/值传递给map函数,但不知道如何处理.x引用需要评估的质量这一事实:mutate(df2 = map2(variable, value, ~filter(df1, .x==.y))) --天真的!!.x将无法工作。
在这里,我的data.frame有一个变量列,一个值列,将在一个过滤器调用中映射:
tibble(variable=c("wool", "tension"),
value= c("A", "L"))
#> # A tibble: 2 x 2
#> variable value
#> <chr> <chr>
#> 1 wool A
#> 2 tension L我怎样才能把这些传递给过滤器?我应该把变量声明为数量吗?我尝试了几种方法:
library(tidyverse)
data(warpbreaks)
tibble(variable=c("wool", "tension"),
value= c("A", "L")) %>%
mutate(data_filtered=map2(variable, value, ~filter(warpbreaks, .x==.y)))
#> # A tibble: 2 x 3
#> variable value data_filtered
#> <chr> <chr> <list>
#> 1 wool A <data.frame [0 × 3]>
#> 2 tension L <data.frame [0 × 3]>
tibble(variable=c(quo(wool), quo(tension)),
value= c("A", "L")) %>%
mutate(data_filtered=map2(variable, value, ~filter(warpbreaks, eval_tidy(.x)==.y)))
#> Error in eval_tidy(.x): object 'wool' not found发布于 2019-05-09 07:18:02
在您的示例中,您尝试以嵌套的方式使用dplyr谓词:mutate()中有一个mutate()。这对于正常使用很好,但是我们在使用整洁的eval特性时需要小心一点,因为这些特性在调用外部函数时应用得很早。由于这个原因,如果您尝试在内部动词中使用!!或.data,通常会出现计时问题。
@zack的答案显示了如何分两步分解问题,以避免嵌套问题。在这种情况下,另一种可能是通过直接在mutate()上映射来省略df步骤(因为这个想法可以直接映射到@Spacedman )。在这里,我们将使用pmap(),它在列表或数据框架上并行映射:
# For pretty-printing
options(tibble.print_max = 5, tibble.print_min = 5)
warpbreaks <- as_tibble(warpbreaks)
pmap(df, ~ filter(warpbreaks, .data[[.x]] == .y))
#> [[1]]
#> # A tibble: 27 x 3
#> breaks wool tension
#> <dbl> <fct> <fct>
#> 1 26 A L
#> 2 30 A L
#> 3 54 A L
#> 4 25 A L
#> 5 70 A L
#> # … with 22 more rows
#>
#> [[2]]
#> # A tibble: 18 x 3
#> breaks wool tension
#> <dbl> <fct> <fct>
#> 1 26 A L
#> 2 30 A L
#> 3 54 A L
#> 4 25 A L
#> 5 70 A L
#> # … with 13 more rows发布于 2019-05-09 10:01:44
您可以使用R的本机替换工具,在处理环境时,rlang更有价值,但是对于更复杂的符号替换(例如嵌套),基R更容易(至少对我来说)。
tibble(variable=c("wool", "tension"),
value= c("A", "L")) %>%
mutate(data_filtered=map2(variable, value, ~eval(bquote(
filter(warpbreaks, .(sym(.x)) ==.y)))))
tibble(variable=c("wool", "tension"),
value= c("A", "L")) %>%
mutate(data_filtered=map2(variable, value, ~eval(substitute(
filter(warpbreaks, X ==.y), list(X = sym(.x))))))
# output for either
# # A tibble: 2 x 3
# variable value data_filtered
# <chr> <chr> <list>
# 1 wool A <data.frame [27 x 3]>
# 2 tension L <data.frame [18 x 3]>https://stackoverflow.com/questions/56026143
复制相似问题