如何将按ID单行存储的表格转换为按ID+列单行存储的形式?
如何将宽格式数据框转换为长格式(无需for循环)?
原始数据
原始数据框定义如下:
Table <- data.frame(ID=c(1,2),A=c("TRUE","FALSE"), B=c("1","2"))
对应的表格形式:
| ID | A | B |
|---|---|---|
| 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"))
对应的表格形式:
| ID | COLUMN | VALUE |
|---|---|---|
| 1 | A | "TRUE" |
| 2 | A | "FALSE" |
| 1 | B | "1" |
| 2 | B | "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
相关产品推荐
相关产品推荐

