在R语言中实现特定结构数据的行列转置与格式重塑
在R语言中实现数据集的行列转置与格式重塑
原始数据集
先把你提供的表格转换成R可直接处理的数据框:
# 构建原始数据框 original_data <- data.frame( Name = c("A", "A", "B", "B"), On_Off = c("On", "Off", "On", "Off"), July_Inbound = c(5, 6, 4, 8), July_Outbound = c(1, 3, 2, 7), August_Inbound = c(3, 9, 5, 6), August_Outbound = c(4, 2, 7, 1) )
注:这里把原始表格的列名调整为July_Inbound这类带下划线的格式,方便后续拆分月份和方向信息。
实现步骤(基于tidyverse工具)
首先加载tidyverse包,它包含了用于数据重塑的tidyr和数据处理的dplyr:
library(tidyverse)
步骤1:宽格式转长格式,拆分月份与方向
用pivot_longer把每个月份的入站/出站列整合,同时从列名中提取Month和Direction:
long_data <- original_data %>% pivot_longer( cols = starts_with(c("July", "August")), # 选中所有月份相关的列 names_to = c("Month", "Direction"), # 将列名拆分为月份和方向两个变量 names_sep = "_" # 以下划线为分隔符拆分列名 )
这一步后,数据会变成每行对应一组Name、On_Off、Month、Direction和对应数值的长格式。
步骤2:长格式转宽格式,生成On/Off列
用pivot_wider把On_Off的两个取值(On/Off)转为单独的列,同时重命名列名匹配目标格式:
final_data <- long_data %>% pivot_wider( id_cols = c(Month, Direction, Name), # 作为分组依据的列 names_from = On_Off, # 要转为列的变量 values_from = value # 对应的值 ) %>% rename(Station = Name) # 将Name重命名为Station
步骤3:调整列顺序(可选,完全匹配目标格式)
final_data <- final_data %>% select(Month, Direction, Station, On, Off)
最终结果
运行上述代码后,final_data就是你需要的目标格式,输出如下:
print(final_data) # # A tibble: 8 × 5 # Month Direction Station On Off # <chr> <chr> <chr> <dbl> <dbl> # 1 July Inbound A 5 6 # 2 July Outbound A 1 3 # 3 August Inbound A 3 9 # 4 August Outbound A 4 2 # 5 July Inbound B 4 8 # 6 July Outbound B 2 7 # 7 August Inbound B 5 6 # 8 August Outbound B 7 1
内容的提问来源于stack exchange,提问作者confusedpandah
相关产品推荐
相关产品推荐

