You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:06:13