如何在R中将列作为类别完成数据框长宽格式转换?
R 宽表转长表实现方案
以下提供两种实现方式,优先满足base R的需求:
1. 简洁Base R实现(无需安装第三方包)
首先构造测试用宽表数据(可跳过这步直接替换为你自己的数据集):
# 示例宽表数据 wide_df <- data.frame( year = c(2020, 2021, 2022, 2023), big = c(100, 120, 150, 180), small = c(30, 45, 55, 70) )
写法1:用stack函数(代码最短)
long_df <- cbind(year = rep(wide_df$year, 2), stack(wide_df, select = c(big, small))) # 调整列名和顺序匹配要求 colnames(long_df) <- c("year", "values", "size") long_df <- long_df[, c("size", "values", "year")]
写法2:用reshape函数(灵活性更高)
long_df <- reshape( wide_df, varying = c("big", "small"), v.names = "values", timevar = "size", times = c("big", "small"), direction = "long" ) # 可选:清理冗余字段和行索引 rownames(long_df) <- NULL long_df <- long_df[, c("size", "values", "year")]
2. 第三方包实现(tidyr 语法更易读)
如果允许使用第三方包,tidyr::pivot_longer的逻辑更直观,不容易出错:
# 未安装则先执行:install.packages("tidyr") library(tidyr) long_df <- pivot_longer( wide_df, cols = c(big, small), names_to = "size", values_to = "values" )
转换后输出示例:
size values year 1 big 100 2020 2 small 30 2020 3 big 120 2021 4 small 45 2021 5 big 150 2022 6 small 55 2022 7 big 180 2023 8 small 70 2023
内容的提问来源于stack exchange,提问作者Levittstyle
相关产品推荐
相关产品推荐

