R语言如何使用pivot_longer将按月拆分的宽格式数据转为长格式
解答
完全可以使用pivot_longer()实现该转换,这是该函数的典型适用场景,具体实现步骤如下:
- 加载依赖包
pivot_longer()属于tidyr包,可单独加载tidyr,也可直接加载整合了数据处理全流程功能的tidyverse包:library(tidyr) # 可选:加载完整tidyverse集合 # library(tidyverse) - 确认原始数据格式
转换前需保证待拉长的指标列命名符合指标名_月份的规则,和你给出的Accrued_Jan、Paid_Feb这类命名一致,id、Country、City三个固定列无需预处理。
以下是和你描述完全匹配的示例宽表,可对照检查自己的数据集结构:# 示例宽格式数据 wide_data <- data.frame( id = 1:2, Country = c("China", "United States"), City = c("Beijing", "Chicago"), Accrued_Jan = c(120, 340), Accrued_Feb = c(150, 360), Accrued_Mar = c(180, 410), Paid_Jan = c(90, 300), Paid_Feb = c(130, 320), Paid_Mar = c(160, 390) ) - 执行宽转长核心代码
转换的核心逻辑是:选中所有非固定列,将列名按下划线拆分为两部分,第一部分直接作为新的值列列名(即Accrued、Paid),第二部分提取为月份存入新增的Month列,代码如下:long_data <- pivot_longer( data = wide_data, # 选中排除3个固定列外的所有待转换列 cols = !c(id, Country, City), # 拆分列名后,第一部分作为值列名,第二部分存入Month字段 names_to = c(".value", "Month"), # 指定列名的拆分分隔符为下划线 names_sep = "_" ) - 结果校验
运行后得到的长表将保留id、Country、City三个原始固定列,新增Month列存储Jan、Feb、Mar三类月份值,同时生成Accrued、Paid两个独立列存储对应月份的指标数值,可通过head(long_data)直接查看转换结果。
补充说明:如果你的列名不是以下划线作为分隔符,只需替换
names_sep参数为实际分隔符即可;如果列名规则更复杂,可替换为names_pattern参数传入正则表达式匹配拆分规则,你当前的列命名格式用names_sep = "_"是最简洁的实现方式。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

