在R中如何实现数据集的宽转长再转宽的指定格式转换?
R实现指定长-宽交叉格式转换的方法
步骤1:加载工具包并构造/清洗原始数据
首先使用tidyverse工具集处理数据,同时清理Range列的多余空格:
library(tidyverse) # 构造原始数据集(若从外部导入,替换为read.table/read_csv等) df <- tibble( ID = c(1,1,2,2), Name = c("A","B","A","B"), n = c(1477,1475,445,446), Mean_SD = c("3.42(15.12)", "127.114 (668.781)", "3.35(20.41)", "113.142(817.681 )"), q2 = c(0.8,0.8,0.5,1.7), q1_q3 = c("0.4,1.9", "3.5,29.3", "0.3,1.25", "0.775,6.225"), Range = c("0 - 343.7", "0.071 - 16013.2", "0.1 - 343.7", "0.1 - 9518") ) %>% # 清理Range列的多余连续空格 mutate(Range = str_squish(Range))
步骤2:执行长-宽格式交叉转换
通过两次数据重塑完成需求:先将指标列转为长格式,再将ID转为宽格式:
# 核心转换逻辑 result_df <- df %>% # 将n、Mean_SD等指标列转为长格式,生成Summary列 pivot_longer(cols = n:Range, names_to = "Summary", values_to = "Value") %>% # 将ID的不同取值转为列,对应填充指标值 pivot_wider(names_from = ID, values_from = Value) %>% # 按Name和指定指标顺序排序,匹配目标格式 arrange(Name, match(Summary, c("n", "Mean_SD", "q2", "q1_q3", "Range")))
步骤3:输出带合并单元格的表格(可选)
如果需要实现目标格式中Name列合并单元格的显示效果,可使用kableExtra包:
library(kableExtra) result_df %>% kable() %>% kable_styling() %>% collapse_rows(columns = 1, valign = "top")
转换后的result_df数据框结构与需求完全一致:Name和Summary作为行维度,1、2作为列维度对应原ID的取值。
内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai
相关产品推荐
相关产品推荐

