如何用R将姓名-部门列表转换为列长度不一的表格?
解决方案
可以用tidyverse工具链完成这个自动化转换,步骤如下:
- 分组排序并添加行号
先按部门分组,对每个组内的姓名按字母顺序排序,再为每组内的姓名分配行号,确保同一行号对应各部门的第N个姓名:
library(tidyverse) df_processed <- df %>% group_by(DEPT) %>% arrange(NAME) %>% # 按字母排序姓名 mutate(row_id = row_number()) %>% # 为每组内的姓名添加行号 ungroup()
- 转换为宽格式表格
使用pivot_wider将长格式转为宽格式,自动提取部门作为列名,空缺位置用NA填充:
df_table <- df_processed %>% pivot_wider( id_cols = row_id, names_from = DEPT, values_from = NAME, values_fill = NA # 空缺位置填充NA ) %>% select(-row_id) # 移除临时行号列
- (可选)调整列的顺序
如果需要让列按部门名称的字母顺序排列,可添加这一步:
df_table <- df_table %>% select(sort(names(.)))
运行上述代码后,得到的df_table完全符合需求:各部门列内姓名按字母排序,空缺位置填充NA,且自动提取所有唯一部门作为列名,无需手动指定。
测试示例数据的输出结果:
# A tibble: 5 × 3 CP QP Tox <chr> <chr> <chr> 1 Sophia Abdullah Emma 2 Matteo Isabella Lea 3 NA Liam Olivia 4 NA Muhammed NA 5 NA Noah NA
该方案适配数据量变化和部门变动的场景,只要维护好原始的姓名部门列表(比如从CSV读取),运行脚本就能自动生成目标表格,可直接用于RMarkdown幻灯片生成人员名单。
内容的提问来源于stack exchange,提问作者jsgraydon
相关产品推荐
相关产品推荐

