新手如何使用pivot_longer实现数据集长宽格式转换
pivot_longer 用法讲解与格式转换实现
核心逻辑
pivot_longer是R语言tidyr包中用于宽表转长表的函数,你可以把它理解成「叠列」操作:把多列存储的同类型数据纵向堆叠,最终生成两列核心数据:一列存原表的列名(也就是你要的维度值,比如这里的年份),一列存原表对应单元格的数值。
你只需要记4个最常用的核心参数,就能覆盖90%的使用场景:
data:传入需要转换的原始数据集cols:指定哪些列需要被纵向堆叠,这些列的列名通常本身是某一个变量的取值(比如本例中的1960、1962、1963列,列名本身就是年份值)names_to:给堆叠后存储原列名的新列指定列名values_to:给堆叠后存储原单元格数值的新列指定列名
针对你的数据集的转换步骤
你的原始数据第一行是错位的无效表头,需要先做简单清理,再做长宽转换,完整代码如下:
# 加载需要的包 library(tidyr) library(dplyr) # 1. 读取并清理原始数据,去掉错位的无效表头行 raw_data <- tibble( col1 = c("Data", "Country", "Norway"), col2 = c("World", "Code", "NOR"), col3 = c("1", "1960", "3.5"), col4 = c("2", "1962", "2.7"), col5 = c("3", "1963", "5.4") ) # 提取第二行作为有效表头,第三行作为有效数据 valid_header <- raw_data[2, ] |> unlist(use.names = FALSE) clean_df <- raw_data[3, ] colnames(clean_df) <- valid_header # 2. 用pivot_longer做宽转长 final_df <- clean_df |> pivot_longer( # 要堆叠的列:排除国家名、国家编码两列,剩下的所有年份列都要转 cols = -c(Country, Code), # 原列名(年份)存到叫Year的新列 names_to = "Year", # 原数值存到叫Norway的新列,匹配你的目标表列名 values_to = "Norway" ) |> # 调整列顺序,和你要的目标结构完全一致 select(Norway, Year)
运行后得到的final_df结构完全匹配你的需求:
| Norway | Year |
|---|---|
| 3.5 | 1960 |
| 2.7 | 1962 |
| 5.4 | 1963 |
常见踩坑提醒
用pivot_longer最容易出错的地方是
cols参数选不对:你就判断列的属性,如果列名本身是一个变量的具体取值(比如年份、月份、分类标签),这些列就需要放进cols里做堆叠;如果列里存的是观测的固定属性(比如国家ID、用户名这类不会随维度变化的值),就排除掉不用转。
内容的提问来源于stack exchange,提问作者user17530453
相关产品推荐
相关产品推荐

