首页 > 解决方案 > 如何转换/重新格式化 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 终端中使用它。

标签: rcsvunix

解决方案


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

推荐阅读