r - 如何转换/重新格式化 csv 文件?
问题描述
我有一个格式奇怪的 csv 文件,它是我需要来自 672 行数据的仪器的输出。它有多个样品和垂直排列的化合物的输出浓度。它看起来像这样:
"Sample 1"
"Compound A", 1
"Compound B", 1
"Compound C", 1
"Sample 2"
"Compound A", 3
"Compound B", 3
"Compound C", 3
"Sample 3"
"Compound A", 2
"Compound B", 2
"Compound C", 2
老实说,就实现这一目标而言,我不知道从哪里开始。我通常会在 R 中进行这种类型的转换,但文件格式在读入 R 时仍然难以处理。
在 R 中,当读取 csv 文件时:
Test <- read.csv("Test.csv", sep=",", header=FALSE)
我得到以下信息:
V1 V2
1 Sample 1 NA
2 Compound A 1
3 Compound B 1
4 Compound C 1
5 Sample 2 NA
6 Compound A 3
7 Compound B 3
8 Compound C 3
9 Sample 2 NA
10 Compound A 2
11 Compound B 2
12 Compound C 2
我希望得到一个输出文件,其中以 Samples 作为列,以 Compounds 作为行,每个文件的浓度都正确。例如:
Sample 1 Sample 2 Sample 3
Compound 1 1 3 2
Compound 2 1 3 2
Compound 3 1 3 2
因此,R 解决方案或 unix 解决方案可以工作,因为我可以将数据帧写入文本文件并在 bash 终端中使用它。
解决方案
R 也是清理数据的好语言。我会做这样的事情:
df <- read.csv('/tmp/data', header=F)
v <- seq_len(nrow(df))
v[!is.na(df$V2)] <- NA
v <- zoo::na.locf(v)
df$sample <- df$V1[v]
df <- df[!is.na(df$V2),]
这zoo::na.locf
用于主要任务,当一行的内容必须影响后续行时,我总是认为这是一个不错的选择。
现在你有一个data.frame
包含样本编号的列:
V1 V2 sample
2 Compound A 1 Sample 1
3 Compound B 1 Sample 1
4 Compound C 1 Sample 1
6 Compound A 3 Sample 2
7 Compound B 3 Sample 2
8 Compound C 3 Sample 2
10 Compound A 2 Sample 3
11 Compound B 2 Sample 3
12 Compound C 2 Sample 3
使用“高”到“宽”格式的选项之一应该可以帮助您完成剩下的工作:
> reshape(df, idvar='V1', direction='wide', timevar='sample')
V1 V2.Sample 1 V2.Sample 2 V2.Sample 3
2 Compound A 1 3 2
3 Compound B 1 3 2
4 Compound C 1 3 2
推荐阅读
- java - 如何在android上的按钮上画一条线?
- javascript - 没有记录时如何隐藏列表?
- c - 在 C 程序中接收分段错误(核心转储)
- django - 在更新和设置新权限期间向序列化数据添加密码值 (drf)
- laravel - 删除电报机器人中的多条消息
- firebase - 我的 firebase 项目正在尝试部署到另一个项目
- javascript - 可以在 HTML 正文的末尾注册 Web 组件(JavaScript 原生)吗?
- python - 多尺度模板匹配,规范方法不起作用
- mysql - Mac 更新并重新启动后,我的 sql 服务器无法工作 - 错误 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'
- language-agnostic - 基于堆栈的语言:寄存器的优缺点?