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

如何将按ID单行存储的表格转换为按ID+列单行存储的形式?

如何将宽格式数据框转换为长格式(无需for循环)?

原始数据

原始数据框定义如下:

Table <- data.frame(ID=c(1,2),A=c("TRUE","FALSE"), B=c("1","2"))

对应的表格形式:

IDAB
1"TRUE""1"
2"FALSE""2"

目标数据

希望转换为如下长格式数据框:

Table_transformed <- data.frame(ID=c(1,2,1,2),COLUMN=c("A","A","B","B"), VALUE=c("TRUE","FALSE","1","2"))

对应的表格形式:

IDCOLUMNVALUE
1A"TRUE"
2A"FALSE"
1B"1"
2B"2"

解决方案

无需使用for循环,有两种通用的高效方法:

方法1:使用tidyverse的pivot_longer(推荐)

pivot_longer是tidyverse中专门用于宽转长的函数,语法简洁直观:

# 未安装tidyverse先运行:install.packages("tidyverse")
library(tidyverse)

Table_transformed <- Table %>%
  pivot_longer(
    cols = -ID,  # 指定除ID外的所有列参与转换
    names_to = "COLUMN",  # 原列名存入新列COLUMN
    values_to = "VALUE"   # 原列值存入新列VALUE
  )

方法2:使用base R的reshape函数

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

Table_transformed <- reshape(
  Table,
  varying = c("A", "B"),  # 指定要转换的列
  v.names = "VALUE",      # 值对应的新列名
  timevar = "COLUMN",     # 列名对应的新列名
  times = c("A", "B"),    # 新列COLUMN的取值
  direction = "long"      # 转换方向为长格式
)
# 调整行顺序并清理行名(可选)
Table_transformed <- Table_transformed[order(Table_transformed$COLUMN), c("ID", "COLUMN", "VALUE")]
rownames(Table_transformed) <- NULL

两种方法均为向量化操作,效率远高于循环,且能精准得到目标格式的数据框。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:20