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

求助:优化R语言代码以支持多&符号拆分data.frame数值

问题解决:处理多&分割的Value均分与汇总需求

原始数据

df <- data.frame(
  "Col1" = c("P1", "P1", "P1", "P2", "P2", "P2", "P3", "P3", "P3", "P3"),
  "Col2" = c("L", "L&R", "R", "V", "V&N", "N", "M", "I", "I&M", "I&M&G"),
  "Value" = c("20", "5", "75", "30", "7", "63", "10", "80", "2","8")
)

需求说明

  • 当Col2包含&连接的多个标识时,将对应Value数值除以拆分后的标识数量(如L&R拆为2个则除以2,I&M&G拆为3个则除以3)
  • 将均分后的值加到同一Col1分组下对应单个标识的Value上
  • 最终仅保留单个标识的行

优化后的代码

library(tidyverse)

df %>%
  # 转换Value为数值型,计算拆分后的标识数量
  mutate(
    Value = as.numeric(Value),
    split_count = str_count(Col2, "&") + 1  # &的数量+1即为拆分后的标识总数
  ) %>%
  # 计算每个拆分标识应得的数值
  mutate(per_value = Value / split_count) %>%
  # 将多标识的Col2拆分为单独行
  separate_rows(Col2, sep = "&") %>%
  # 按Col1和Col2分组求和,保留两位小数匹配示例格式
  group_by(Col1, Col2) %>%
  summarise(Value = round(sum(per_value), 2)) %>%
  ungroup()

代码说明

  1. 数值转换与数量计算:先将字符型的Value转为数值型,通过str_count统计&的数量,加1得到拆分后的标识总数
  2. 均分计算:用原Value除以拆分数量,得到每个标识应分配的数值
  3. 拆分多行:使用separate_rows将多标识的条目拆分为单独行
  4. 分组求和:按Col1和Col2分组汇总,完成数值累加并格式化小数位数

输出结果

运行代码后得到如下结果(与示例仅存在四舍五入差异,若需完全匹配示例的截断式小数,可替换round为floor(sum(per_value)*100)/100):

# A tibble: 7 × 3
  Col1  Col2  Value
  <chr> <chr> <dbl>
1 P1    L      22.5
2 P1    R      77.5
3 P2    N      66.5
4 P2    V      33.5
5 P3    G       2.67
6 P3    I      83.67
7 P3    M      13.67

若需完全匹配示例的字符型Value格式,可修改summarise部分为:

summarise(Value = sprintf("%.2f", sum(per_value))) %>%

内容的提问来源于stack exchange,提问作者Marwah Al-kaabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:53:17