Как преобразовать / переформатировать CSV-файл? - PullRequest
1 голос
/ 23 мая 2019

У меня есть странно отформатированный 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.

Ответы [ 2 ]

3 голосов
/ 23 мая 2019

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
0 голосов
/ 23 мая 2019

Вот tidyverse метод выполнения той же очистки в R. Мы можем:

  1. read_lines файл, чтобы получить вектор символов с одной строкой на элемент
  2. str_remove_all литеральные кавычки в каждой строке
  3. Поместите строки в столбец tibble (dataframe)
  4. str_detect независимо от того, является ли каждая строка составной строкой с данными или простоОбразец заголовка.Используйте cumsum, чтобы отметить составные строки правильным номером образца, а затем filter заголовки
  5. separate Идентификаторы соединений из значений концентрации
  6. spread данные изв широкоформатный формат.
library(tidyverse)
file <- read_lines(
'"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'
)
file %>%
  str_remove_all("\"") %>%
  tibble(line = .) %>%
  mutate(sample =  str_detect(line, "Sample") %>% cumsum %>% str_c("Sample_", .)) %>%
  filter(!str_detect(line, "Sample")) %>%
  separate(line, c("compound", "concentration"), sep = ", ") %>%
  spread(sample, concentration)
#> # A tibble: 3 x 4
#>   compound   Sample_1 Sample_2 Sample_3
#>   <chr>      <chr>    <chr>    <chr>   
#> 1 Compound A 1        3        2       
#> 2 Compound B 1        3        2       
#> 3 Compound C 1        3        2

Создано в 2019-05-23 с помощью пакета представитель (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...