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

如何重塑含年份列名的数据以得到唯一countrycode-year对

解决宽表转长表时countrycode-year组合重复的问题

你的代码连续两次调用pivot_longer,会导致笛卡尔积重复:第一次转置hdi列后,每个国家已经对应3行(1999/2000/2001三个年份);第二次转置icrg列时,会把这3行的每一行再拆成3行,最终每个国家会生成9行数据,自然出现重复的countrycode-year组合。

正确解决方案

利用pivot_longer的.value参数,一次性完成宽表转长表的操作,直接得到符合需求的唯一组合数据集:

library(tidyr)
library(dplyr)

# 示例数据框
df <- data.frame(countrycode=c("A","B","C"),
                 hdi_1999 = c(0.7, 0.8, 0.6),
                 hdi_2000 = c(0.71, 0.81, 0.61),
                 hdi_2001 = c(0.72, 0.82, 0.62),
                 icrg_1999 = c(60, 50, 70),
                 icrg_2000 = c(61, 51, 71),
                 icrg_2001 = c(62, 52, 72))

# 生成目标数据集
df_new <- df %>%
  pivot_longer(
    cols = -countrycode,  # 保留countrycode列,处理其余所有列
    names_to = c(".value", "year"),  # .value指定用列名前缀作为值列名,下划线后部分作为year列
    names_sep = "_"  # 用下划线拆分原列名
  )

# 验证countrycode-year组合唯一性
all(!duplicated(df_new[, c("countrycode", "year")]))
# 输出结果为TRUE,说明组合完全唯一

代码说明

  • cols = -countrycode:明确只转置除国家代码外的所有列;
  • names_to = c(".value", "year"):这是核心逻辑——通过names_sep = "_"把原列名(如hdi_1999)拆成两部分,第一部分hdi作为新值列的名称(由.value标识),第二部分1999作为year列的取值;
  • 转置完成后,每个countrycode-year组合仅出现一次,同时对应该行的hdi和icrg数值,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:53:09