如何在mutate中为生成的多列指定自定义列名?
如何在mutate函数中为生成的多列指定列名?
针对你提供的R代码场景,有两种简洁的方法可以将生成的zz.x1、zz.x2、zz.x3重命名为zz1、zz2、zz3:
方法1:直接在across中指定列名(推荐)
修改mutate语句,利用across的.names参数,在生成列的同时直接定义目标列名,避免额外的重命名步骤:
set.seed(5) data.frame(x2 = sample(1:10, 10), x3 = sample(1:10, 10), x1 = sample(1:10, 10), y3 = sample(1:10, 10), y2 = sample(1:10, 10), y1 = sample(1:10, 10)) |> mutate(z1 = x1 - y1, z2 = x2 - y2, z3 = x3 - y3) |> mutate(across(num_range(prefix = 'x', range = 1:3), # 匹配对应的y列进行计算 ~ .x - get(str_replace(.col, "x", "y")), # 自定义列名:去掉x前缀,替换为zz开头 .names = "zz{str_remove(.col, 'x')}"))
原理说明:
across(num_range('x',1:3))遍历所有x开头的目标列str_replace(.col, "x", "y")将当前x列名替换为对应的y列名,用get()获取该列的值.names = "zz{str_remove(.col, 'x')}"定义新列名规则:把原列名的x去掉,前缀换成zz,比如x1生成zz1
方法2:生成后重命名
如果保留原有的zz = across(...) - across(...)写法,可后续用rename_with批量修改列名:
set.seed(5) data.frame(x2 = sample(1:10, 10), x3 = sample(1:10, 10), x1 = sample(1:10, 10), y3 = sample(1:10, 10), y2 = sample(1:10, 10), y1 = sample(1:10, 10)) |> mutate(z1 = x1 - y1, z2 = x2 - y2, z3 = x3 - y3) |> mutate(zz = across(num_range(prefix = 'x', range = 1:3)) - across(num_range(prefix = 'y', range = 1:3))) |> # 批量重命名以zz.x开头的列 rename_with(~ str_replace(., "zz.x", "zz"), starts_with("zz.x"))
原理说明:
starts_with("zz.x")筛选出所有需要修改的列str_replace(., "zz.x", "zz")将列名中的zz.x替换为zz,实现zz.x1→zz1的转换
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

