如何将R语言数据框的就业列名转为日期并重塑为长格式?
R语言宽格式转长格式:提取日期字段并重塑数据
针对你提供的宽格式数据集,我们可以通过两种常用方法完成宽转长操作,同时提取字段名中的日期信息并转换为Date类型:
方法一:使用tidyverse工具(推荐)
先加载dplyr和tidyr包(未安装的话先运行install.packages("tidyverse")):
library(dplyr) library(tidyr)
执行数据转换:
mydatafinal <- mydata %>% pivot_longer( cols = starts_with("employment_"), # 选中所有就业状态相关的宽列 names_pattern = "employment_(.*)", # 正则提取列名中`employment_`后的日期部分 names_to = "date", # 提取的日期存入date列 values_to = "employment" # 原列的就业状态值存入employment列 ) %>% mutate(date = as.Date(date, "%Y_%m_%d")) # 将下划线分隔的日期字符串转为Date类型
步骤说明
pivot_longer是宽转长的核心函数,自动为每个日期生成对应行names_pattern通过正则精准捕获日期字符串,避免拆分错误- 最后用
mutate完成日期类型转换,确保后续可进行日期相关操作
方法二:使用Base R原生函数
无需加载额外包,直接用reshape函数实现:
mydatafinal <- reshape( mydata, direction = "long", # 指定转换为长格式 varying = grep("employment_", names(mydata), value = TRUE), # 筛选需要转换的列 v.names = "employment", # 就业状态值的列名 timevar = "date", # 日期列的列名 times = sub("employment_", "", grep("employment_", names(mydata), value = TRUE)), # 提取日期字符串 idvar = c("id", "cohort", "maledummy") # 保留的个体标识列 ) %>% transform(date = as.Date(date, "%Y_%m_%d")) %>% # 转换日期类型 arrange(id, date) # 按个体和日期排序,匹配示例结果顺序
验证结果
转换完成后,可通过以下代码确认结果与目标数据集一致:
# 对比手动创建的目标数据集 all.equal(mydatafinal, mydatafinal_target)
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

