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
相关产品推荐
相关产品推荐

