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

如何在R语言中按多条件将数据框的一行拆分为两行

R语言实现按条件拆分数值并替换分组

问题背景

给定两个数据集:

  • 源数据集 orig_src_df:包含分类字段(cat1、cat2、col3)、分组字段(grp1)和数值字段(nums)
  • 转换规则数据集 conversion_df:定义了特定grp1对应的目标分组grp2和数值拆分比例ratio,仅适用于cat1 == "Text1"且cat2 == "AA"的场景

需求:对源数据中满足cat1 == "Text1"且cat2 == "AA"的行,按conversion_df的比例拆分nums,并用grp2替换原grp1;其余行保持原样。

简洁实现方案

使用tidyverse套件(dplyr+tidyr)的管道操作可高效完成需求,代码如下:

library(tidyverse)

# 处理需要拆分替换的行
processed <- orig_src_df %>%
  filter(cat1 == "Text1", cat2 == "AA") %>%
  left_join(conversion_df, by = c("grp1", "cat1", "cat2")) %>%
  mutate(
    nums = nums * ratio,  # 按比例拆分数值
    grp1 = grp2           # 替换分组字段
  ) %>%
  select(all_of(names(orig_src_df)))  # 保留原数据的列结构

# 保留无需处理的行
unprocessed <- orig_src_df %>%
  filter(!(cat1 == "Text1" & cat2 == "AA"))

# 合并得到最终结果
final_df <- bind_rows(unprocessed, processed)

代码说明

  • filter:精准筛选出需要处理的行,避免无关数据干扰
  • left_join:基于grp1、cat1、cat2关联转换规则,确保每一行匹配对应的拆分比例
  • mutate:完成两个核心操作——按比例计算新的nums值,将grp1替换为grp2
  • select:保证处理后的行和原数据列结构完全一致,便于后续分析
  • bind_rows:合并处理后的行和未处理的行,得到完整结果

如果需要恢复原数据的行顺序,可在bind_rows后添加arrange(col3)(col3为源数据的唯一标识列):

final_df <- bind_rows(unprocessed, processed) %>% arrange(col3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:51:04