合并DataFrame重复行并为差异值创建新列的实现方法
解决DataFrame相似行聚合并拆分不同值的问题
嘿,刚好碰到过类似的需求!咱们可以用tidyverse工具包来轻松搞定这个任务——核心思路是先按公司分组处理统一信息,再把不同的员工信息转成宽格式的新列。
先看看你给出的原始数据:
dataframe1 <- data.frame(Company_Name = c("KFC", "KFC", "KFC", "McD", "McD"), Company_ID = c(1, 1, 1, 2, 2), Company_Phone = c("237389", "-", "-", "237002", "-"), Employee_Name = c("John", "Mary", "Jane", "Joshua", "Anne"), Employee_ID = c(1001, 1002, 1003, 2001, 2002))
具体解决方案代码
library(tidyverse) # 处理聚合与列转换 aggregated_df <- dataframe1 %>% # 按公司维度分组 group_by(Company_Name, Company_ID) %>% # 1. 提取有效的公司电话(排除占位符"-"),同时给每个员工编序号 mutate( Company_Phone = first(Company_Phone[Company_Phone != "-"]), emp_seq = row_number() ) %>% # 2. 把员工信息转成宽格式,生成带序号的新列 pivot_wider( names_from = emp_seq, values_from = c(Employee_Name, Employee_ID), names_glue = "{.value}_{emp_seq}" # 自定义新列名的格式 ) %>% # 取消分组状态 ungroup() # 查看最终结果 print(aggregated_df)
输出结果说明
运行后你会得到这样的结构化DataFrame:
# A tibble: 2 × 8 Company_Name Company_ID Company_Phone Employee_Name_1 Employee_Name_2 Employee_Name_3 Employee_ID_1 Employee_ID_2 Employee_ID_3 <chr> <dbl> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> 1 KFC 1 237389 John Mary Jane 1001 1002 1003 2 McD 2 237002 Joshua Anne NA 2001 2002 NA
关键步骤解释
- 分组处理电话:用
first(Company_Phone[Company_Phone != "-"])提取每组里第一个非"-"的有效电话,确保同一个公司只保留唯一正确的联系电话。 - 生成员工序号:
row_number()给每个公司下的员工按顺序编号,为后续拆分不同员工信息提供标识。 - 转宽格式拆分列:
pivot_wider把原来每行的员工信息,按序号拆分成Employee_Name_1、Employee_ID_2这类带编号的新列,完美实现“合并相似行、拆分不同值”的需求。
内容的提问来源于stack exchange,提问作者R noob
相关产品推荐
相关产品推荐

