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

