You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分同时含字符串和年份的变量并将年份单独设为新变量

解决方案

方法1:使用tidyverse的pivot_longer(最推荐)

无需单独调用colsplit,pivot_longer原生支持拆分列名生成目标结构,适配你的列名规则:

# 加载tidyverse包
library(tidyverse)

df_long <- df %>%
  pivot_longer(
    # 可根据需求调整选中列的规则,比如有其他非指标列时替换为ends_with(as.character(2000:2005))
    cols = everything(),
    # .value表示拆分后的前半部分直接作为新列名,后半部分存入Year列
    names_to = c(".value", "Year"),
    # 按末尾4位年份前的下划线拆分,避免指标名内含下划线时拆分错误
    names_sep = "_(?=\\d{4}$)"
  )

运行后直接得到包含Year、Civilian_labor_force、Employed、Unemployed、Unemployment_rate的长表结构。

方法2:基础R实现(无第三方包依赖)

用基础R自带的reshape函数即可完成转换:

# 筛选出所有带年份后缀的指标列
measure_cols <- grep("_(200[0-5])$", names(df), value = TRUE)
# 提取统一的指标前缀
var_names <- unique(sub("_(\\d{4})$", "", measure_cols))

df_long <- reshape(
  df,
  varying = measure_cols,
  v.names = var_names,
  times = 2000:2005,
  timevar = "Year",
  direction = "long"
)
# 移除reshape自动生成的冗余id列(按需操作)
df_long$id <- NULL

方法3:colsplit实现方案

如果你需要用到colsplit,可以结合reshape2的长宽转换函数实现:

library(reshape2)

# 先把宽表转为变量-值对的长表
df_melt <- melt(df, measure.vars = measure_cols)
# 用colsplit拆分变量名得到指标名和年份
df_melt[, c("indicator", "Year")] <- colsplit(df_melt$variable, "_(?=\\d{4}$)", c("indicator", "Year"))
# 再按指标名转回宽表得到目标结构
df_long <- dcast(df_melt, ... ~ indicator, value.var = "value")

内容的提问来源于stack exchange,提问作者cdm183

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:09:03