如何重塑含年份列名的数据以得到唯一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
相关产品推荐
相关产品推荐

