首页 > 解决方案 > 简化 R 代码:dlpylr mutate,根据单独数据框中的值乘以某些列

问题描述

我一直在尝试在 mutate 中进行乘法运算,使用不同 data.frame 中的值(它只有一行包含值),并将整个列与相同的列名相乘。我设法让它工作,但这是我能做到的唯一方法,而且看起来很乱。我想知道是否有人可以帮助我简化它。(最好以一种允许我将其保留在更大的 dpylr 链中的方式)。

prioritydata <- data[, -(3:16)] %>%
                mutate(Q1 = as.numeric(Q1) * as.numeric(questionweighting$Q1),
                       Q2 = as.numeric(Q2) * as.numeric(questionweighting$Q2), 
                       Q3 = as.numeric(Q3) * as.numeric(questionweighting$Q3), 
                       Q4 = as.numeric(Q4) * as.numeric(questionweighting$Q4), 
                       Q5 = as.numeric(Q5) * as.numeric(questionweighting$Q5), 
                       Q6 = as.numeric(Q6) * as.numeric(questionweighting$Q6), 
                       Q7 = as.numeric(Q7) * as.numeric(questionweighting$Q7), 
                       Q8 = as.numeric(Q8) * as.numeric(questionweighting$Q8),
                       Q9 = as.numeric(Q9) * as.numeric(questionweighting$Q9), 
                       Q10 = as.numeric(Q10) * as.numeric(questionweighting$Q10),
                       Q11 = as.numeric(Q11) * as.numeric(questionweighting$Q11), 
                       Q12 = as.numeric(Q12) * as.numeric(questionweighting$Q12))

提前致谢。

标签: rmultiplicationdplyr

解决方案


这是一个更好的选择。如果列都是数字并且具有相同的行数,则将两个数据集中的“Q”列子集,乘以相等大小的数据集并更新这些列的“数据”

nm1 <- paste0("Q", 1:12)
data[nm1] <- data[nm1] * questionweighting[nm1]

tidyverse中,这可以通过map2

library(dplyr)
library(purrr)
map2_df(data, questionweighting, ~ map2_at(vars(nm1), .x
                                .y , ~
                                 as.numeric(.x) * as.numeric(.y)) %>%
                                bind_cols)

推荐阅读