如何用tidyr的pivot_longer将指定宽格式数据集转为目标长格式?
宽转长格式解决方案(tidyr实现)
首先得明确你的原始数据结构,我先模拟一个符合你描述的示例数据集:
# 模拟原始宽格式数据 d <- data.frame( V1 = c("y/x", "length", "A", "B", "C"), V2 = c("code", NA, "101", "102", "103"), V3 = c("2000", "14", "5.2", "3.7", "6.1"), V4 = c("2001", "15", "4.9", "2.8", "5.5"), V5 = c("2002", "16", "6.3", "4.1", "7.0") )
你的问题核心是原始数据的表头是两行(年份+长度),直接用pivot_longer会因为表头不规范报错,得先整理表头再转换:
步骤1:整理复合表头
把前两行的年份和长度合并成新的列名,然后从第三行开始取实际数据:
library(tidyr) library(dplyr) # 提取前两行作为表头信息 header_year <- d[1, -c(1,2)] %>% as.character() header_length <- d[2, -c(1,2)] %>% as.character() # 合并年份和长度为新列名 new_colnames <- paste(header_year, header_length, sep = "_") # 重构数据集:保留前两列的实际数据,替换表头 d_clean <- d[-c(1,2), ] colnames(d_clean) <- c("y_x", "code", new_colnames)
步骤2:用pivot_longer转长格式
现在可以正常使用pivot_longer,把复合列拆分成year、length和value:
d_long <- d_clean %>% pivot_longer( cols = -c(y_x, code), # 保留y/x和code列,其他列转长 names_to = c("year", "length"), # 拆分列名为year和length names_sep = "_", # 按下划线拆分 values_to = "value" # 对应的值列名 ) %>% # 转换数据类型(year和length转数值,value按需转) mutate( year = as.integer(year), length = as.integer(length), value = as.numeric(value) )
最终结果
执行后d_long的结构就是你要的:y_x、code、year、length、value。如果你的原始数据和模拟示例有细微差异,比如列的位置不同,只要调整-c(1,2)这类索引即可。
内容的提问来源于stack exchange,提问作者m0byn
相关产品推荐
相关产品推荐

