如何在R中重塑纵向数据集:将多列转换为行
在R中将宽格式数据集转换为纵向长格式
方法1:使用tidyverse包的pivot_longer(推荐)
这是现代R生态中处理宽转长的标准工具,语法清晰灵活。
首先构造示例数据:
library(tidyverse) # 原始宽格式数据 wide_data <- data.frame( ID = c(100, 200), y1_demo = c("A", "B"), y2_demo = c("B", "A"), y1_ex = c("A", "A"), y2_ex = c("B", "C"), stringsAsFactors = FALSE )
执行宽转长操作:
long_data <- wide_data %>% pivot_longer( cols = -ID, # 保留ID列,转换其余所有列 names_to = c("Year", ".value"), # Year存储年份标识,.value自动匹配变量名(demo/ex) names_pattern = "^y(\\d)_(.*)$" # 正则拆分列名:提取年份数字和变量类型 ) %>% mutate(Year = paste0("Y", Year)) # 将年份数字格式化为Y1/Y2
运行后得到的结果如下:
> long_data # A tibble: 4 × 4 ID Year demo ex <dbl> <chr> <chr> <chr> 1 100 Y1 A A 2 100 Y2 B B 3 200 Y1 B A 4 200 Y2 A C
方法2:使用reshape2包的melt
如果习惯传统reshape工具链,可按以下步骤操作:
library(reshape2) # 第一步:转成基础长格式 melted_data <- melt(wide_data, id.vars = "ID") # 第二步:拆分变量名列 melted_data <- melted_data %>% separate(variable, into = c("Year", "var"), sep = "_") %>% mutate(Year = str_replace(Year, "y", "Y")) %>% # 第三步:将变量类型转回宽格式 pivot_wider(names_from = var, values_from = value)
两种方法均可得到目标纵向数据集,优先推荐tidyverse方案,更契合现代R代码风格。
内容的提问来源于stack exchange,提问作者Katie
相关产品推荐
相关产品推荐

