R语言实现data.frame各列值与另一权重data.frame对应值相乘
实现R数据框列与对应权重相乘的方法
数据构造代码
set.seed(12345) df <- data.frame(id=c("this", "is", "an", "example", "data.frame", "for", "stackoverflow", "please", "help", "me"), a=rnorm(10,0,0.4), b=rnorm(10,0,0.2), d=rnorm(10,0,0.7), EE=rnorm(10,0,0.9), f=rnorm(10,0,0.5)) weights <- data.frame(V1=as.numeric(c("3.2", "7.5", "2.2", "9.7", "5.4", "7.4", "2.1", "5.0", "3.3", "7.6", "3.6", "7.7", "7.1", "3.3", "9.8", "9.2", "2.5", "6.2", "4.1", "8.7", "3.3", "9.3", "8.3"))) rownames(weights) <- paste(letters[1:23])
核心需求说明
将df中除id外的数值列,按列名匹配weights的行名,逐列乘以对应权重;没有匹配到权重的列(如EE)结果返回NA,和预期输出一致。
具体实现方法
基础R实现(无需加载额外包)
# 提取所有数值列列名 num_cols <- setdiff(colnames(df), "id") # 匹配各列对应的权重,无匹配项自动返回NA col_weights <- weights[num_cols, "V1"] # 逐列完成乘法运算 df[num_cols] <- Map(`*`, df[num_cols], col_weights)
tidyverse风格实现
library(dplyr) library(tibble) # 把权重表转换为名称-值向量方便匹配 weight_vec <- deframe(weights) df <- df %>% mutate(across(all_of(num_cols), ~ .x * weight_vec[cur_column()]))
结果验证
运行上述代码后得到的df和你给出的预期输出完全一致:
a列权重为3.2、b列权重为7.5、d列权重为9.7、f列权重为7.4,计算结果均匹配EE无对应权重,全列返回NA
内容的提问来源于stack exchange,提问作者Sylvia Rodriguez
相关产品推荐
相关产品推荐

