如何在R中根据医师姓名为每行分配递增编号以实现长表转宽
解决方案:为医师教育记录分配行号并转换为宽表
一、分配RowAssign列
你的循环函数存在语法错误(if语句格式、变量引用逻辑有误),在R中处理这种分组编号需求,更高效简洁的方式是使用以下两种方法:
方法1:使用tidyverse(dplyr)
# 加载dplyr包 library(dplyr) # 假设你的数据框名为df,包含"Practitioner Name"列 df <- df %>% group_by(`Practitioner Name`) %>% mutate(RowAssign = row_number()) %>% ungroup()
group_by()按医师姓名分组row_number()在每个分组内生成从1开始递增的序号,不同分组自动重置为1
方法2:使用Base R
如果不想加载额外包,可使用ave函数:
# 为数据框添加RowAssign列 df$RowAssign <- ave(rep(1, nrow(df)), df$`Practitioner Name`, FUN = seq_along)
ave()按医师姓名分组,seq_along为每个分组生成连续序号
二、转换为宽表
完成行号分配后,可使用tidyr包的pivot_wider函数将长表转为宽表,让每位医师的所有教育记录位于同一行:
# 加载tidyr包 library(tidyr) # 转换为宽表,替换为你的实际教育字段(如学校、年份等) wide_df <- df %>% pivot_wider( id_cols = `Practitioner Name`, # 作为唯一标识的列 names_from = RowAssign, # 用于区分同一医师不同记录的列 values_from = c(EducationSchool, EducationYear), # 需要展开的教育相关列 names_glue = "{.value}_{RowAssign}" # 生成带序号的列名,如EducationSchool_1 )
内容的提问来源于stack exchange,提问作者NatS
相关产品推荐
相关产品推荐

