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

在R语言中将多列宽格式数据转换为长格式

将宽格式数据转换为指定长格式(R语言)

原始宽格式数据

country <- c("afg", "alb", "aus")
gdp_2018 <- c(123, 532, 555)
gdp_2019 <- c(233, 531, 621)
gdp_2020 <- c(112, 231, 323)
inf_2018 <- c(0.1, 0.2, 0.3)
inf_2019 <- c(0.01, 0.01, 0.2)
inf_2020 <- c(0.5, 0.4, 0.4)
df <- cbind.data.frame(country, gdp_2018, gdp_2019, gdp_2020,
                       inf_2018, inf_2019, inf_2020)

转换方法(推荐使用tidyr包)

使用tidyr中的pivot_longer函数可以高效实现宽转长,代码如下:

# 若未安装tidyr包,先运行 install.packages("tidyr")
library(tidyr)

# 执行宽转长操作
long_df <- df %>%
  pivot_longer(
    cols = -country,  # 排除不需要转换的country列
    names_to = c(".value", "year"),  # 将列名拆分为变量前缀和年份两部分
    names_pattern = "(.*)_(\\d{4})",  # 正则匹配列名里的前缀(gdp/inf)和4位年份
    values_drop_na = TRUE  # 可选:删除含NA的行,本次数据无NA可省略
  )

# 将year列转为数值型(默认是字符型,按需转换)
long_df$year <- as.numeric(long_df$year)

转换结果验证

运行后long_df的结构与你指定的长格式完全一致:

> long_df
# A tibble: 9 × 4
  country year   gdp   inf
  <chr>   <dbl> <dbl> <dbl>
1 afg      2018   123  0.1 
2 afg      2019   233  0.01
3 afg      2020   112  0.5 
4 alb      2018   532  0.2 
5 alb      2019   531  0.01
6 alb      2020   231  0.4 
7 aus      2018   555  0.3 
8 aus      2019   621  0.2 
9 aus      2020   323  0.4 

补充:Base R实现方式

如果不想加载额外包,可使用base R原生的reshape函数:

long_df <- reshape(df,
                   varying = list(c("gdp_2018", "gdp_2019", "gdp_2020"),
                                 c("inf_2018", "inf_2019", "inf_2020")),
                   v.names = c("gdp", "inf"),
                   timevar = "year",
                   times = c(2018, 2019, 2020),
                   direction = "long")
# 移除自动生成的行名
rownames(long_df) <- NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:18:32