将所有列名传递给 mutate() 内的 pmap()
pass all column names to pmap() inside mutate()
在 mutate
中执行 pmap
时,我经常喜欢使用以下结构,这样我就可以在 map
函数中引用普通列名而不是 ..1
、..2
等,并且必须跟踪我给他们的顺序:
library(tidyverse)
mtcars %>%
nest(data = -c(vs, am, gear, carb)) %>%
mutate(plot = pmap(lst(vs, am, gear, carb, data), ~with(list(...), {
# not relevant to question, just example task:
ggplot(data = data, aes(x = wt, y = mpg)) + geom_point() +
labs(subtitle = (paste0("am=", am, "\n",
"carb=", carb, "\n",
"gear=", gear, "\n",
"vs=", vs)))
})))
#> # A tibble: 14 x 6
#> vs am gear carb data plot
#> <dbl> <dbl> <dbl> <dbl> <list> <list>
#> 1 0 1 4 4 <tibble [2 x 7]> <gg>
#> 2 1 1 4 1 <tibble [4 x 7]> <gg>
#> 3 1 0 3 1 <tibble [3 x 7]> <gg>
#> 4 0 0 3 2 <tibble [4 x 7]> <gg>
#> 5 0 0 3 4 <tibble [5 x 7]> <gg>
#> 6 1 0 4 2 <tibble [2 x 7]> <gg>
#> 7 1 0 4 4 <tibble [2 x 7]> <gg>
#> 8 0 0 3 3 <tibble [3 x 7]> <gg>
#> 9 1 1 4 2 <tibble [2 x 7]> <gg>
#> 10 0 1 5 2 <tibble [1 x 7]> <gg>
#> 11 1 1 5 2 <tibble [1 x 7]> <gg>
#> 12 0 1 5 4 <tibble [1 x 7]> <gg>
#> 13 0 1 5 6 <tibble [1 x 7]> <gg>
#> 14 0 1 5 8 <tibble [1 x 7]> <gg>
我的问题是,我可以在 lst()
中放入什么,以便将所有列传递给映射函数,而不是像上面那样将它们全部写出?我尝试了 names(.)
和 !!!names(.)
作为我的第一次尝试。或者,如果有更简洁的方法来做到这一点,比如不使用 lst()
,那也很好。
要传递所有内容,您可以使用 .
而无需单独指定每一列。
library(tidyverse)
mtcars %>%
nest(data = -c(vs, am, gear, carb)) %>%
mutate(plot = pmap(., ~with(list(...), {
# not relevant to question, just example task:
ggplot(data = data, aes(x = wt, y = mpg)) + geom_point() +
labs(subtitle = (paste0("am=", am, "\n",
"carb=", carb, "\n",
"gear=", gear, "\n",
"vs=", vs)))
})))
# vs am gear carb data plot
# <dbl> <dbl> <dbl> <dbl> <list> <list>
# 1 0 1 4 4 <tibble [2 × 7]> <gg>
# 2 1 1 4 1 <tibble [4 × 7]> <gg>
# 3 1 0 3 1 <tibble [3 × 7]> <gg>
# 4 0 0 3 2 <tibble [4 × 7]> <gg>
# 5 0 0 3 4 <tibble [5 × 7]> <gg>
# 6 1 0 4 2 <tibble [2 × 7]> <gg>
# 7 1 0 4 4 <tibble [2 × 7]> <gg>
# 8 0 0 3 3 <tibble [3 × 7]> <gg>
# 9 1 1 4 2 <tibble [2 × 7]> <gg>
#10 0 1 5 2 <tibble [1 × 7]> <gg>
#11 1 1 5 2 <tibble [1 × 7]> <gg>
#12 0 1 5 4 <tibble [1 × 7]> <gg>
#13 0 1 5 6 <tibble [1 × 7]> <gg>
#14 0 1 5 8 <tibble [1 × 7]> <gg>
在 mutate
中执行 pmap
时,我经常喜欢使用以下结构,这样我就可以在 map
函数中引用普通列名而不是 ..1
、..2
等,并且必须跟踪我给他们的顺序:
library(tidyverse)
mtcars %>%
nest(data = -c(vs, am, gear, carb)) %>%
mutate(plot = pmap(lst(vs, am, gear, carb, data), ~with(list(...), {
# not relevant to question, just example task:
ggplot(data = data, aes(x = wt, y = mpg)) + geom_point() +
labs(subtitle = (paste0("am=", am, "\n",
"carb=", carb, "\n",
"gear=", gear, "\n",
"vs=", vs)))
})))
#> # A tibble: 14 x 6
#> vs am gear carb data plot
#> <dbl> <dbl> <dbl> <dbl> <list> <list>
#> 1 0 1 4 4 <tibble [2 x 7]> <gg>
#> 2 1 1 4 1 <tibble [4 x 7]> <gg>
#> 3 1 0 3 1 <tibble [3 x 7]> <gg>
#> 4 0 0 3 2 <tibble [4 x 7]> <gg>
#> 5 0 0 3 4 <tibble [5 x 7]> <gg>
#> 6 1 0 4 2 <tibble [2 x 7]> <gg>
#> 7 1 0 4 4 <tibble [2 x 7]> <gg>
#> 8 0 0 3 3 <tibble [3 x 7]> <gg>
#> 9 1 1 4 2 <tibble [2 x 7]> <gg>
#> 10 0 1 5 2 <tibble [1 x 7]> <gg>
#> 11 1 1 5 2 <tibble [1 x 7]> <gg>
#> 12 0 1 5 4 <tibble [1 x 7]> <gg>
#> 13 0 1 5 6 <tibble [1 x 7]> <gg>
#> 14 0 1 5 8 <tibble [1 x 7]> <gg>
我的问题是,我可以在 lst()
中放入什么,以便将所有列传递给映射函数,而不是像上面那样将它们全部写出?我尝试了 names(.)
和 !!!names(.)
作为我的第一次尝试。或者,如果有更简洁的方法来做到这一点,比如不使用 lst()
,那也很好。
要传递所有内容,您可以使用 .
而无需单独指定每一列。
library(tidyverse)
mtcars %>%
nest(data = -c(vs, am, gear, carb)) %>%
mutate(plot = pmap(., ~with(list(...), {
# not relevant to question, just example task:
ggplot(data = data, aes(x = wt, y = mpg)) + geom_point() +
labs(subtitle = (paste0("am=", am, "\n",
"carb=", carb, "\n",
"gear=", gear, "\n",
"vs=", vs)))
})))
# vs am gear carb data plot
# <dbl> <dbl> <dbl> <dbl> <list> <list>
# 1 0 1 4 4 <tibble [2 × 7]> <gg>
# 2 1 1 4 1 <tibble [4 × 7]> <gg>
# 3 1 0 3 1 <tibble [3 × 7]> <gg>
# 4 0 0 3 2 <tibble [4 × 7]> <gg>
# 5 0 0 3 4 <tibble [5 × 7]> <gg>
# 6 1 0 4 2 <tibble [2 × 7]> <gg>
# 7 1 0 4 4 <tibble [2 × 7]> <gg>
# 8 0 0 3 3 <tibble [3 × 7]> <gg>
# 9 1 1 4 2 <tibble [2 × 7]> <gg>
#10 0 1 5 2 <tibble [1 × 7]> <gg>
#11 1 1 5 2 <tibble [1 × 7]> <gg>
#12 0 1 5 4 <tibble [1 × 7]> <gg>
#13 0 1 5 6 <tibble [1 × 7]> <gg>
#14 0 1 5 8 <tibble [1 × 7]> <gg>