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

如何优雅实现R数据框转长:列名转单列,行转多列

优雅实现R数据框的格式转换需求

首先构造示例宽格式数据框(模拟你提到的sapply转换后的结果):

set.seed(123)
df_wide <- data.frame(
  A = rnorm(3),
  B = rnorm(3),
  C = rnorm(3)
)
rownames(df_wide) <- paste0("Row", 1:3)

目标是将原数据框的列名转为单列,原各行转为不同列,以下是几种优雅的实现方案:

方案1:Tidyverse链式转置(最简洁)

利用转置+ tibble行名转列的特性,一行完成转换:

library(tidyverse)

df_target <- df_wide %>%
  t() %>%
  as_tibble(rownames = "variable")

转置后原列名自动成为行名,as_tibble(rownames = "variable")直接将行名提取为variable列,完美匹配需求。

方案2:宽→长→宽的显式转换(可读性强)

如果需要更清晰展示转换逻辑,先将原行名转为列,再通过两次 pivot 操作实现:

df_target <- df_wide %>%
  rownames_to_column("row_id") %>%
  pivot_longer(-row_id, names_to = "variable", values_to = "value") %>%
  pivot_wider(names_from = "row_id", values_from = "value")

这个步骤更直观,适合理解格式转换的完整流程。

方案3:Base R轻量实现(无需加载包)

如果不想依赖tidyverse,用base R也能快速完成:

df_target <- cbind(variable = rownames(t(df_wide)), as.data.frame(t(df_wide)))

转置后直接将行名绑定为第一列,再转为数据框即可。

关于你之前遇到的问题说明

  • 直接构造数据框出错:大概率是没有正确处理转置后的行名/列名对应关系,或是维度匹配错误;
  • pivot_longer+group_by+mutate报错:这种组合不适合生成宽格式列,应该用pivot_wider替代group_by+mutate来实现列的转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:10:43