如何将R语言数据框转为宽格式并以PID最后一位分组?
解决R语言数据框转指定宽格式的问题
可以借助tidyverse工具包中的dplyr和tidyr函数实现需求,步骤如下:
1. 加载工具包并准备原始数据
# 若未安装tidyverse,先执行安装命令 # install.packages("tidyverse") library(tidyverse) # 原始数据框 example <- data.frame( PID = c(11191, 11192, 21191, 21193), NS = c(1,5,9,13), NR = c(2,6,10,14), SE = c(3,7,11,15), GR = c(4,8,12,16) )
2. 数据转换处理
example_processed <- example %>% # 从PID拆分出目标标识(去掉最后一位)和分组标识(最后一位) mutate( target = floor(PID / 10), group = PID %% 10 ) %>% # 移除原PID列 select(-PID) %>% # 转换为宽格式 pivot_wider( id_cols = target, # 作为行唯一标识的列 names_from = group, # 用于生成列名的分组变量 values_from = c(NS, NR, SE, GR), # 需要转换的数值列 names_glue = "{.value}_{group}" # 定义列名格式:变量名_分组号 )
3. 验证结果
运行后得到的example_processed与你期望的结构完全一致:
example_processed # target NS_1 NR_1 SE_1 GR_1 NS_2 NR_2 SE_2 GR_2 NS_3 NR_3 SE_3 GR_3 # 1 1119 1 2 3 4 5 6 7 8 NA NA NA NA # 2 2119 9 10 11 12 NA NA NA NA 13 14 15 16
补充:使用data.table实现
若偏好data.table工具包,也可以用以下代码完成转换:
# 若未安装data.table,先执行安装命令 # install.packages("data.table") library(data.table) setDT(example) # 拆分PID的两部分 example[, `:=`(target = floor(PID/10), group = PID%%10)] # 转换为宽格式 example_solution_dt <- dcast(example, target ~ group, value.var = c("NS", "NR", "SE", "GR"), sep = "_")
内容的提问来源于stack exchange,提问作者jo_
相关产品推荐
相关产品推荐

