R语言入门者求助:如何将宽格式CSV转长格式并写入新文件
解决R语言宽表转长表并写入文件的问题
嘿,作为R语言初学者,你要实现的是把宽格式的数据转换成窄(长)格式,这是数据处理里很常见的需求,我给你两种方案,一种是新手友好的工具包方法,另一种是原生R方法,你可以选适合自己的~
先确认你的数据情况
首先,你读入的data数据框应该是这样的(修正了你示例里的小笔误,让列数匹配):
| a | b | c | d |
|---|---|---|---|
| 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 0 |
| 1 | 1 | 0 | 1 |
| 0 | 0 | 0 | 1 |
如果读入后第一列没有列名(会显示成X或者V1),先给它起个清晰的名字,比如group:
colnames(data)[1] <- "group"
方案1:用tidyverse的pivot_longer(推荐,语法更直观)
tidyverse是R语言里专门做数据处理的工具包,pivot_longer就是专门用来宽转长的函数:
- 先安装并加载tidyverse(如果没装过的话):
install.packages("tidyverse") library(tidyverse)
- 转换数据格式:
# 将除了group列之外的所有列,转换成"variable"(存储原列名)和"value"(存储对应数值)两列 long_data <- data %>% pivot_longer(cols = -group, names_to = "variable", values_to = "value")
- 写入新文件(分号分隔,不输出列名和行名,完全匹配你要的格式):
write_delim(long_data, "/home/beka/long_data.csv", delim = ";", col_names = FALSE)
方案2:用base R原生的reshape函数(不需要额外装包)
如果你不想装新包,用原生R也能实现:
# 转换格式 long_data_base <- reshape(data, varying = colnames(data)[-1], # 指定要转换的列(除了group) v.names = "value", # 存储数值的列名 timevar = "variable", # 存储原列名的列名 times = colnames(data)[-1], # 把原列名作为新列的取值 direction = "long") # 整理成你要的列顺序,并去掉自动生成的id列和行名 long_data_base <- long_data_base[, c("group", "variable", "value")] row.names(long_data_base) <- NULL # 写入文件 write.table(long_data_base, "/home/beka/long_data_base.csv", sep = ";", row.names = FALSE, col.names = FALSE)
两种方法最终都会生成你要的目标格式:
A;a;0
A;b;0
A;c;1
A;d;0
B;a;1
B;b;1
...(后续行以此类推)
内容的提问来源于stack exchange,提问作者Dossanov




