在R语言中向量化修改DataFrame的实现方法
解决方案:根据前缀列批量转换DataFrame数值列
方法一:使用dplyr(tidyverse)批量处理
这种方法代码简洁,适合习惯tidyverse语法的用户:
library(dplyr) # 定义需要修改的列向量 columns_for_change <- c("store_value", "shop_items", "in_bank", "owed_money") # 执行转换 df_transformed <- df %>% mutate(across(all_of(columns_for_change), ~ case_when( # 匹配BP前缀,对应乘以val_BP_to_x !!sym(paste0("prefix_", cur_column())) == "BP" ~ .x * val_BP_to_x, # 匹配SR前缀,对应乘以val_SR_to_x !!sym(paste0("prefix_", cur_column())) == "SR" ~ .x * val_SR_to_x, # GD或其他情况保持原值 TRUE ~ .x )))
代码说明:
across(all_of(columns_for_change)):遍历所有指定的数值列cur_column():获取当前正在处理的列名,自动拼接出对应的前缀列(比如处理in_bank时,拼接成prefix_in_bank)!!sym(...):把字符串格式的列名转换成可引用的列对象,让case_when能识别对应的前缀列case_when:按条件分支处理,分别匹配BP、SR、GD三种情况的计算逻辑
方法二:使用Base R循环处理
如果不想加载额外包,用Base R的循环也能实现:
columns_for_change <- c("store_value", "shop_items", "in_bank", "owed_money") # 遍历每个需要修改的列 for(col in columns_for_change) { # 构造对应的前缀列名 prefix_col <- paste0("prefix_", col) # 生成每个行对应的乘数:BP取val_BP_to_x,SR取val_SR_to_x,GD取1(乘1不改变原值) multiplier <- ifelse(df[[prefix_col]] == "BP", df$val_BP_to_x, ifelse(df[[prefix_col]] == "SR", df$val_SR_to_x, 1)) # 更新当前列的值 df[[col]] <- df[[col]] * multiplier }
代码说明:
- 循环逐个处理目标列,逻辑直观易懂
- 用
df[[col]]的方式引用列,避免字符串列名的引用问题 - 嵌套
ifelse生成乘数向量,一次性计算所有行的对应系数,效率不低
验证结果
执行后可以检查示例中的关键值:
- id=1的
in_bank列:450 * 0.86 = 387,符合预期 - id=3的
store_value列:470 * 0.87 = 408.9,符合预期
内容的提问来源于stack exchange,提问作者The Curious One
相关产品推荐
相关产品推荐

