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

在R语言中如何按唯一值将单列数据拆分为多列?数据集转换求助

解决R语言数据集格式转换问题

嘿,别发愁啦!这种数据集的格式重塑在R里真的是日常操作,最顺手的工具当属tidyverse生态里的tidyr包——语法直观,新手也能快速上手。我先给你讲两种最常见的转换场景,你可以对照自己的Dataset 1和Dataset 2来调整:

场景1:宽表转长表(最常见的需求)

假设你的Dataset 1是宽表(每类变量占一列),比如这样:

学生ID数学成绩语文成绩英语成绩
1908588
2789280

而你要转成的Dataset 2是长表(变量类型和对应值分成两列):

学生ID科目成绩
1数学成绩90
1语文成绩85
1英语成绩88
2数学成绩78
2语文成绩92
2英语成绩80

那用pivot_longer()函数一步就能搞定:

# 先安装并加载tidyverse(如果还没装的话)
install.packages("tidyverse")
library(tidyverse)

# 执行宽转长
dataset2 <- dataset1 %>%
  pivot_longer(
    cols = -学生ID,  # 指定除了"学生ID"之外的所有列都要转换
    names_to = "科目",  # 原列名要放到新列"科目"里
    values_to = "成绩"  # 原列对应的值要放到新列"成绩"里
  )

场景2:长表转宽表

如果你的需求反过来,是把长表转成宽表,那就用pivot_wider()函数,还是用上面的例子:

dataset2 <- dataset1 %>%
  pivot_wider(
    id_cols = 学生ID,  # 按"学生ID"作为分组依据
    names_from = 科目,  # 用"科目"列的内容作为新列的列名
    values_from = 成绩  # 用"成绩"列的内容填充新列
  )

备选方案:基础R的reshape()函数

如果你不想加载额外的包,基础R自带的reshape()也能实现,但语法稍微繁琐一点。还是拿宽转长举例:

dataset2 <- reshape(
  dataset1,
  direction = "long",
  varying = c("数学成绩", "语文成绩", "英语成绩"),  # 指定要转换的列
  v.names = "成绩",
  timevar = "科目",
  times = c("数学成绩", "语文成绩", "英语成绩")
)
# 整理一下结果格式
rownames(dataset2) <- NULL
dataset2 <- dataset2[, c("学生ID", "科目", "成绩")]

如果你的数据集结构和我举的例子不一样(比如有多个分组列、或者值列有特殊格式),可以把Dataset 1和Dataset 2的具体结构贴出来,我再帮你调整代码~

内容的提问来源于stack exchange,提问作者smk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:12:47