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

如何使用tidyverse(RStudio)代码调整数据的行列结构?

使用tidyverse调整数据行列结构

嘿,在tidyverse里调整数据行列结构其实很简单,主要靠tidyr包的pivot_longer()和pivot_wider()这两个核心函数,我给你举几个常见场景的例子,你可以根据自己的数据集对应调整:

1. 宽格式转长格式(把多列合并为类别+值两行)

如果你的原始数据是宽格式(比如每个指标占一列,像下面的示例),想要把这些指标列转成单独的行,可以用pivot_longer():

示例原始宽格式数据

library(tidyverse)

# 模拟你的数据集
original_wide <- tibble(
  学生ID = c(101, 102, 103),
  姓名 = c("张三", "李四", "王五"),
  语文 = c(85, 79, 92),
  数学 = c(90, 85, 88),
  英语 = c(78, 91, 84)
)

转换代码

# 宽转长:把语文、数学、英语列转为「科目」和「成绩」两行
long_format <- original_wide %>%
  pivot_longer(
    cols = c(语文, 数学, 英语),  # 指定需要转换的列(也可用starts_with/ends_with等批量匹配)
    names_to = "科目",          # 存储原列名的新列名
    values_to = "成绩"          # 存储原列值的新列名
  )

转换后的数据结构会变成每行对应一个学生的一个科目成绩,更适合做分组分析或可视化。

2. 长格式转宽格式(把两行拆分为多列)

如果你的数据是长格式,想要把类别列的值拆成单独的列(比如把每个科目拆成一列),就用pivot_wider():

示例原始长格式数据

original_long <- tibble(
  学生ID = c(101,101,101,102,102,102),
  姓名 = c("张三","张三","张三","李四","李四","李四"),
  科目 = c("语文","数学","英语","语文","数学","英语"),
  成绩 = c(85,90,78,79,85,91)
)

转换代码

# 长转宽:把「科目」列的值转为新列,「成绩」列的值填充对应位置
wide_format <- original_long %>%
  pivot_wider(
    names_from = 科目,  # 用哪一列的值作为新列名
    values_from = 成绩  # 用哪一列的值填充新列
  )

3. 特殊情况:数据转置(行列互换)

如果需要整个数据框的行列互换(比如把行变成列,列变成行),可以结合t()和tidyverse的函数处理:

# 数据转置示例
transposed_data <- original_wide %>%
  t() %>%  # 转置矩阵
  as_tibble(rownames = "原列名") %>%  # 转为 tibble,保留原列名作为新列
  rename_with(~paste0("行_", .x), starts_with("V"))  # 给新列重命名

小提示

  • 如果你有更复杂的需求(比如多列同时转换、处理缺失值),可以给pivot_longer()或pivot_wider()加额外参数,比如values_fill填充缺失值,names_prefix给新列加前缀等。
  • 记得先加载tidyverse包(library(tidyverse)),它会自动加载tidyr、dplyr等需要的工具包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:32:15