You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言入门者求助:如何将宽格式CSV转长格式并写入新文件

解决R语言宽表转长表并写入文件的问题

嘿,作为R语言初学者,你要实现的是把宽格式的数据转换成窄(长)格式,这是数据处理里很常见的需求,我给你两种方案,一种是新手友好的工具包方法,另一种是原生R方法,你可以选适合自己的~

先确认你的数据情况

首先,你读入的data数据框应该是这样的(修正了你示例里的小笔误,让列数匹配):

abcd
0010
1110
1101
0001

如果读入后第一列没有列名(会显示成X或者V1),先给它起个清晰的名字,比如group

colnames(data)[1] <- "group"

方案1:用tidyverse的pivot_longer(推荐,语法更直观)

tidyverse是R语言里专门做数据处理的工具包,pivot_longer就是专门用来宽转长的函数:

  1. 先安装并加载tidyverse(如果没装过的话):
install.packages("tidyverse")
library(tidyverse)
  1. 转换数据格式:
# 将除了group列之外的所有列,转换成"variable"(存储原列名)和"value"(存储对应数值)两列
long_data <- data %>%
  pivot_longer(cols = -group,
               names_to = "variable",
               values_to = "value")
  1. 写入新文件(分号分隔,不输出列名和行名,完全匹配你要的格式):
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

火山引擎 最新活动