在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
相关产品推荐
相关产品推荐

