如何使用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
相关产品推荐
相关产品推荐

