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

新手如何使用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结构完全匹配你的需求:

NorwayYear
3.51960
2.71962
5.41963

常见踩坑提醒

用pivot_longer最容易出错的地方是cols参数选不对:你就判断列的属性,如果列名本身是一个变量的具体取值(比如年份、月份、分类标签),这些列就需要放进cols里做堆叠;如果列里存的是观测的固定属性(比如国家ID、用户名这类不会随维度变化的值),就排除掉不用转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:27:27