如何按CompanyID拆分数据并将年份转为列存储DirectorID?
没问题!我来帮你搞定这个数据转换的需求。你需要把记录董事任职时间段的长表,转换成按公司分组、2006-2016每一年作为列的宽表,列里显示当年在任的DirectorID。下面是具体的实现方案,用R的tidyverse工具包来完成:
第一步:明确原始数据结构
先把你给出的原始数据补全成可运行的格式(最后一条记录的EndYear我默认补为2016,你可以根据实际情况调整):
df <- data.frame( DirectorID = c(11734844255, 187836811559, 196167673, 401544433, 401604433, 5524344997), CompanyID = c(25830, 25830, 25830, 25830, 25830, 12339), StartYear = c(2015, 2006, 2008, 2006, 2006, 2011), EndYear = c(2016, 2016, 2015, 2014, 2010, 2016) )
第二步:核心转换代码
我们分三步实现需求:拆分时间段到每年、分组合并董事ID、转成宽格式:
library(tidyverse) # 1. 把每个董事的任职时间段拆分成单独的年份行,只保留2006-2016的目标年份 df_expanded <- df %>% rowwise() %>% # 生成该董事在2006-2016范围内的所有任职年份 mutate(Year = list(intersect(StartYear:EndYear, 2006:2016))) %>% unnest(Year) %>% ungroup() # 2. 按公司和年份分组,把同年任职的DirectorID合并成列表(也可转成逗号分隔字符串) df_grouped <- df_expanded %>% group_by(CompanyID, Year) %>% summarise(DirectorIDs = list(DirectorID), .groups = "drop") # 3. 转换为宽格式,确保2006-2016所有年份都存在,无数据的年份用空列表填充 df2 <- df_grouped %>% pivot_wider( id_cols = CompanyID, names_from = Year, values_from = DirectorIDs, names_prefix = "Y", # 给年份列加前缀,避免R语法报错(列名不能以数字开头) values_fill = list(DirectorIDs = list()) ) # 如果需要把列表转成逗号分隔的字符串(方便阅读),可以运行这一步 df2_formatted <- df2 %>% mutate(across(starts_with("Y"), ~paste(unlist(.), collapse = ", ")))
结果说明
运行完后,df2就是你要的预期输出:
- 每一行对应一个
CompanyID - 每一列
Y2006到Y2016存储该年份在任的所有DirectorID(以列表形式) - 如果用
df2_formatted,则每个单元格是逗号分隔的ID字符串,更直观
比如CompanyID=25830的Y2006列会包含187836811559, 401544433, 401604433这三个ID,Y2015列会包含11734844255, 187836811559, 196167673,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Tfg1005
相关产品推荐
相关产品推荐

