如何解决将所有列名传递给 mutate() 内的 pmap()
在 pmap
中执行 mutate
时,我经常喜欢使用以下构造,以便我可以引用 map
函数中的普通列名而不是 ..1
、..2
等,并且必须跟踪我给它们的顺序:
library(tidyverse)
mtcars %>%
nest(data = -c(vs,am,gear,carb)) %>%
mutate(plot = pmap(lst(vs,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=","\n","carb=","gear=","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=","\n","carb=",carb,"gear=","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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。