You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言dplyr:如何用向量值对应相乘生成指定新变量

问题:为指定数值列对应乘以向量元素生成新列

原始数据

temp <- tibble::tribble(
~x1, ~x2, ~x3, ~x4, ~x5,
1, 2, 3, 'AA', 'BB',
2, 3, 4, 'AB', 'CC',
3, 4, 5, 'AC', 'DD',
4, 5, 6, 'AD', 'EE',
5, 6, 7, 'AE', 'FF',
6, 7, 8, 'AF', 'GG'
) %>% dplyr::mutate(dplyr::across(x4,as.character), dplyr::across(x5,as.character))

需求

生成新列px1(x11)、px2(x22)、px3(x3*3),对应与向量temp_val <- c(1,2,3)中位置匹配的元素相乘。

原代码问题

原尝试代码中,across(where(is.numeric), ~ . * temp_val)会将每个数值列与整个向量相乘,导致每个新列生成多组数据;同时.names = '{nam1}'的写法无法正确将向量nam1的元素对应到新列,因此结果不符合预期。

正确实现方法

方法1:手动一一映射(适合列数少的场景)

temp_val <- c(1,2,3)
nam1 <- c('px1','px2','px3')

temp5 <- temp %>% 
  mutate(
    !!nam1[1] := x1 * temp_val[1],
    !!nam1[2] := x2 * temp_val[2],
    !!nam1[3] := x3 * temp_val[3]
  )

方法2:批量映射(适合列数多的场景)

利用purrr::map2批量处理目标列与对应乘数,再合并到原数据框:

temp_val <- c(1,2,3)
nam1 <- c('px1','px2','px3')
target_cols <- c('x1','x2','x3')

temp5 <- temp %>% 
  bind_cols(
    purrr::map2_dfc(target_cols, temp_val, ~ temp[[.x]] * .y) %>% 
      set_names(nam1)
  )

方法3:结合across与位置匹配

通过cur_column()获取当前处理的列名,匹配到向量中的对应乘数,同时动态设置新列名:

temp_val <- c(1,2,3)
nam1 <- c('px1','px2','px3')
target_cols <- c('x1','x2','x3')

temp5 <- temp %>% 
  mutate(
    across(all_of(target_cols), 
           ~ .x * temp_val[match(cur_column(), target_cols)],
           .names = '{nam1[match(.col, target_cols)]}'
           )
  )

以上三种方法均能生成符合预期的结果:每个新列对应原数值列与向量中对应位置元素相乘的结果。

内容的提问来源于stack exchange,提问作者jkatam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:41:34