R 数据重塑

在 R 语言中,数据重塑(Data Reshaping)是指改变数据结构以适应分析或可视化的需求,例如将宽格式转换为长格式,或反之。数据重塑在数据清洗和准备中非常常见,尤其在处理数据框时。结合 Visual Studio Code(VSCode)环境,以下是针对 Linux 系统用户的详细中文讲解,假设你已将 VSCode 设置为中文界面并配置了 R 语言支持(参考之前的“R 语言基础”和“数据框”讲解)。内容简洁清晰,适合初学者,涵盖数据重塑的主要方法、在 VSCode 中的使用及常见问题。

R 数据重塑概述

  • 功能:数据重塑用于转换数据框的结构,通常涉及“宽格式”(wide format,每行包含多个变量的观测值)和“长格式”(long format,每行表示一个变量的观测值)之间的转换,适合统计分析、可视化或建模。
  • 主要工具
  • 基础 R:reshape()
  • tidyr 包:pivot_longer()pivot_wider()(推荐,现代且直观)。
  • data.table 或其他包(高级场景)。
  • VSCode 集成:通过 R 扩展(如 REditorSupport.r)支持语法高亮、补全和调试。
  • 前提
  • R 已安装(运行 R --version,安装方法见“R 语言基础”)。
  • VSCode 配置了 R 扩展(ID:REditorSupport.r)和 languageserver 包(install.packages("languageserver"))。
  • 安装 tidyr 包:install.packages("tidyr")
  • 项目目录已打开(参考“打开目录”讲解)。

R 数据重塑基础

以下使用 tidyr 包(推荐)和基础 R 的 reshape() 函数,展示常见重塑操作。

1. 宽格式到长格式

  • 场景:将多列观测值合并为单列,通常用于时间序列或重复测量数据。
  • tidyr 方法pivot_longer()
  library(tidyr)
  # 创建宽格式数据框
  df_wide <- data.frame(
    name = c("Alice", "Bob"),
    math = c(85, 90),
    science = c(88, 92)
  )
  print(df_wide)
  • 输出
    name math science 1 Alice 85 88 2 Bob 90 92
  • 转换到长格式R df_long <- pivot_longer( df_wide, cols = c(math, science), # 要合并的列 names_to = "subject", # 新列名(存储原列名) values_to = "score" # 新列名(存储值) ) print(df_long)
    • 输出
      name subject score 1 Alice math 85 2 Alice science 88 3 Bob math 90 4 Bob science 92
  • 基础 R 方法reshape()
  df_long_base <- reshape(
    df_wide,
    varying = c("math", "science"),
    v.names = "score",
    timevar = "subject",
    direction = "long"
  )
  print(df_long_base)

2. 长格式到宽格式

  • 场景:将单列观测值展开为多列,通常用于汇总或比较。
  • tidyr 方法pivot_wider()
  # 从长格式转换回宽格式
  df_wide_new <- pivot_wider(
    df_long,
    names_from = subject,  # 列名来源
    values_from = score    # 值来源
  )
  print(df_wide_new)
  • 输出
    name math science 1 Alice 85 88 2 Bob 90 92
  • 基础 R 方法reshape()
  df_wide_base <- reshape(
    df_long,
    v.names = "score",
    timevar = "subject",
    idvar = "name",
    direction = "wide"
  )
  print(df_wide_base)

3. 结合 dplyr 增强操作

  • 场景:数据重塑常与数据清洗和汇总结合,使用 dplyr 简化流程。
  • 示例
  library(dplyr)
  df_long <- df_long %>%
    mutate(passed = score >= 90) %>%  # 添加新列
    group_by(subject) %>%
    summarise(mean_score = mean(score))
  print(df_long)
  • 输出
    subject mean_score 1 math 87.5 2 science 90.0

在 VSCode 中使用数据重塑

  1. 创建 R 脚本
  • 新建 reshape.R(右键“文件资源管理器” -> “新建文件”)。
  • 输入示例代码: library(tidyr) library(dplyr) # 创建宽格式数据框 df <- data.frame( name = c("Alice", "Bob", "Charlie"), math = c(85, 90, 95), science = c(88, 92, 78) ) print(df) # 宽到长 df_long <- pivot_longer( df, cols = c(math, science), names_to = "subject", values_to = "score" ) print(df_long) # 长到宽 df_wide <- pivot_wider( df_long, names_from = subject, values_from = score ) print(df_wide) # 统计分析 summary <- df_long %>% group_by(name) %>% summarise(mean_score = mean(score)) print(summary)
  1. 运行代码
  • 选中代码,按 Ctrl+Enter,结果显示在“R 终端”。
  • 或运行整个文件:
    bash Rscript reshape.R
  • 输出name math science 1 Alice 85 88 2 Bob 90 92 3 Charlie 95 78 name subject score 1 Alice math 85 2 Alice science 88 3 Bob math 90 4 Bob science 92 5 Charlie math 95 6 Charlie science 78 name math science 1 Alice 85 88 2 Bob 90 92 3 Charlie 95 78 name mean_score 1 Alice 86.5 2 Bob 91.0 3 Charlie 86.5
  1. 调试
  • 设置断点(行号左侧点击),按 F5(需 R Debugger 扩展和 launch.json 配置,参考“运行和调试”)。
  • 检查数据框结构(如 df_longdf_wide)。

结合可视化

数据重塑后常用于可视化,配合 ggplot2

  • 示例
  library(ggplot2)
  ggplot(df_long, aes(x=name, y=score, fill=subject)) +
    geom_bar(stat="identity", position="dodge")
  • 输出:在 VSCode 的“绘图”面板显示分组柱状图。

常见问题及解决方法

  • 列名错误
  • 确保 pivot_longer()cols 参数正确选择列:
    R pivot_longer(df, cols=c("math", "science")) # 正确 pivot_longer(df, cols=c("wrong")) # 错误
  • 检查 names_fromvalues_from 是否匹配列名。
  • 中文乱码
  • 确保终端编码为 UTF-8(运行 locale,设置为 zh_CN.UTF-8)。
  • 在 VSCode 设置:
    json "terminal.integrated.env.linux": { "LANG": "zh_CN.UTF-8" }
  • 保存文件为 UTF-8(状态栏右下角选择编码)。
  • 示例(中文数据框):
    R df <- data.frame(姓名 = c("张伟", "李娜"), 数学 = c(85, 90), 科学 = c(88, 92)) df_long <- pivot_longer(df, cols=c(数学, 科学), names_to="科目", values_to="分数") print(df_long)
  • VSCode 不显示结果
  • 确保安装 R 扩展和 languageserver 包。
  • 使用 View(df) 在 VSCode 中显示交互式表格。
  • Linux 性能问题
  • 若卡顿,运行 code --disable-gpu
  • 确保目录权限:chmod -R u+rw ~/.config/Code.

实用技巧

  • 快捷键
  • 运行代码:Ctrl+Enter
  • 补全代码:Ctrl+Space(需 languageserver)。
  • 注释:Ctrl+/.
  • 推荐扩展
  • R:核心支持。
  • languageserver:智能补全重塑操作。
  • Better Comments:高亮重塑相关注释。
    bash code --install-extension aaron-bond.better-comments
  • AI 辅助
  • 使用 GitHub Copilot 或 DeepSeek(参考之前讲解),输入 # 重塑 R 数据框为长格式,生成代码。
  • 高效操作
  • 使用 tidyrdplyr 结合:
    R df_long %>% group_by(subject) %>% summarise(mean_score = mean(score))
  • 检查数据结构:str(df_long)

示例:综合数据重塑脚本

  1. 新建 reshape.R
   library(tidyr)
   library(dplyr)

   # 创建宽格式数据框
   df <- data.frame(
     name = c("Alice", "Bob", "Charlie"),
     math = c(85, 90, 95),
     science = c(88, 92, 78)
   )
   print(df)

   # 宽到长
   df_long <- pivot_longer(df, cols=c(math, science), names_to="subject", values_to="score")
   print(df_long)

   # 长到宽
   df_wide <- pivot_wider(df_long, names_from=subject, values_from=score)
   print(df_wide)

   # 统计和可视化
   summary <- df_long %>% group_by(subject) %>% summarise(mean_score = mean(score))
   print(summary)

   library(ggplot2)
   ggplot(df_long, aes(x=subject, y=score, fill=name)) +
     geom_bar(stat="identity", position="dodge")
  1. 运行:
  • 选中代码,按 Ctrl+Enter,查看“R 终端”输出: name math science 1 Alice 85 88 2 Bob 90 92 3 Charlie 95 78 name subject score 1 Alice math 85 2 Alice science 88 3 Bob math 90 4 Bob science 92 5 Charlie math 95 6 Charlie science 78 name math science 1 Alice 85 88 2 Bob 90 92 3 Charlie 95 78 subject mean_score 1 math 90.00000 2 science 86.33333
  • 或运行:
    bash Rscript reshape.R
  • 图表显示在 VSCode 的“绘图”面板。

如果需要深入讲解(如复杂重塑、处理缺失值、与统计建模结合),或有其他问题,请告诉我你的 Linux 发行版、R 版本或具体需求!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注