首页 > 解决方案 > R 在 purrr::map 中使用 dplyr::mutate() 而不复制行

问题描述

这是数据:

library(tidyverse)
col_pre <- c('a', 'b', 'c')
df <- tibble(a1 = 1:3, a2 = 4:6, b1 = 7:9, b2 = 10:12, c1 = 13:15, c2 = 16:18)

我想使用purrr::map()dplyr::mutate()创建三个新列,它们是df. 我可以map()用来迭代 a、b、c 列前缀的向量。我弄清楚了这些tidyeval操作,以便下面的代码可以正常运行。

out <- col_pre %>%
  map_df(~ df %>% 
            mutate(!!as.name(paste0(.x, '3')) := !!as.name(paste0(.x, '1')) + !!as.name(paste0(.x, '2')))
  )

但是,out现在有六个虚假行:

     a1    a2    b1    b2    c1    c2    a3    b3    c3
1     1     4     7    10    13    16     5    NA    NA
2     2     5     8    11    14    17     7    NA    NA
3     3     6     9    12    15    18     9    NA    NA
4     1     4     7    10    13    16    NA    17    NA
5     2     5     8    11    14    17    NA    19    NA
6     3     6     9    12    15    18    NA    21    NA
7     1     4     7    10    13    16    NA    NA    29
8     2     5     8    11    14    17    NA    NA    31
9     3     6     9    12    15    18    NA    NA    33

它所做的是不必要地复制 input 的三行df

这是我想要的输出:

     a1    a2    b1    b2   c1    c2    a3     b3    c3
1     1     4     7    10    13    16     5    17    29
2     2     5     8    11    14    17     7    19    31
3     3     6     9    12    15    18     9    21    33

我有一种感觉purrr::reduce()可能是解决方案,但我不确定如何应用它。

任何帮助表示赞赏!

标签: rdplyrpurrrtidyeval

解决方案



推荐阅读