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

在R中将DataFrame指定列与单列相乘生成新列并追加至原表

解决方案

可以用dplyr包的批量处理功能实现需求,无需手动逐个处理supplier列:

# 加载dplyr包
library(dplyr)

# 假设你的数据框名为df
df <- df %>%
  # 批量生成amt*supplier_n列:匹配所有supplier_开头的列,与amount相乘并按规则命名
  mutate(across(starts_with("supplier_"), 
                ~ .x * amount, 
                .names = "amt*{.col}")) %>%
  # 按ID分组计算amount总和,生成Total_amt列
  group_by(ID) %>%
  mutate(Total_amt = sum(amount)) %>%
  ungroup()

代码细节说明

  • across(starts_with("supplier_"), ~ .x * amount, .names = "amt*{.col}"):

    • starts_with("supplier_") 自动匹配所有以supplier_开头的列,无论数量多少都能覆盖
    • ~ .x * amount 表示将每一个匹配到的列(.x指代当前列)与amount列相乘
    • .names = "amt*{.col}" 定义新列命名规则,比如supplier_1会生成amt*supplier_1
  • group_by(ID) %>% mutate(Total_amt = sum(amount)) %>% ungroup():

    • 按ID分组后,计算每组内amount的总和生成Total_amt列,最后取消分组避免影响后续操作

测试验证

用你提供的示例数据测试:

# 构造测试数据
test_df <- tibble(
  ID = c(1,1,1,2,2,2),
  amount = c(10,15,20,5,8,10),
  supplier_1 = c(0,1,1,0,0,0),
  supplier_2 = c(1,0,0,0,1,0),
  supplier_3 = c(0,0,0,0,0,0),
  supplier_100 = c(0,0,0,1,0,1)
)

# 运行处理代码
test_df <- test_df %>%
  mutate(across(starts_with("supplier_"), ~ .x * amount, .names = "amt*{.col}")) %>%
  group_by(ID) %>%
  mutate(Total_amt = sum(amount)) %>%
  ungroup()

# 查看结果
print(test_df)

运行后会得到你期望的输出,包含所有新增的amt*supplier_n列和Total_amt列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:01:25