使用dplyr的mutate+across时如何保留原列并自动重命名新列
问题描述
当我使用mutate配合across处理数据时,.cols参数选中的列会被转换后的结果直接覆盖。我需要同时满足两个需求:
- 输出结果中保留
.cols选中的所有原始列 - 新生成的列可以自动按规则统一重命名
解决方案
dplyr的across函数内置了.names参数,专门用来处理这类场景,无需额外做表拼接或单独重命名:
- 你可以在
.names参数中用{col}作为原始列名的占位符,自定义新列的命名规则 - 只要设置了
.names参数,mutate就不会覆盖原有列,而是将计算结果作为新列追加到数据集末尾
示例代码如下:
require(dplyr) require(magrittr) set.seed(7337) # 生成测试数据 myTibble <- tibble(x = 1:10, y = runif(10), z = y * pi) # 直接一行实现保留原列+自动重命名新列 myTibble %>% mutate(across(everything(), multiply_by, 2, .names = "{col}_double"))
运行后输出结果和需求完全匹配:
# A tibble: 10 × 6 x y z x_double y_double z_double <int> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 0.890 2.80 2 1.78 5.59 2 2 0.329 1.03 4 0.658 2.07 3 3 0.0527 0.166 6 0.105 0.331 4 4 0.873 2.74 8 1.75 5.49 5 5 0.667 2.10 10 1.33 4.19 6 6 0.508 1.60 12 1.02 3.19 7 7 0.598 1.88 14 1.20 3.75 8 8 0.00397 0.0125 16 0.00794 0.0249 9 9 0.0541 0.170 18 0.108 0.340 10 10 0.868 2.73 20 1.74 5.46
如果需要更复杂的命名规则,也可以在.names里灵活调整,比如加前缀的话设置为"double_{col}"即可。
内容的提问来源于stack exchange,提问作者Captain Hat
相关产品推荐
相关产品推荐

