поиск данных в нескольких текстовых файлах и представление результатов в новой таблице - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть тысячи текстовых файлов, содержащих данные массы,% базы. Мне нужно искать в каждом файле строки в пределах определенного диапазона масс. Затем сообщите эту строку в новую таблицу с именем файла в качестве дополнительного символа. Целью является таблица (Mass,% Base, Filename) для всех текстовых файлов в зависимости от условия поиска.

Пример существующего файла для file1name.txt:

Mass %Base 
100 .1 
101 26.2 
...
900 0

Цель:

Mass %Base File
375.004 98 file1name
375.003 96 file2name

Мой текущий код:

library(tidyverse)
library(readr)

#setwd to where data is located
setwd("Z:/Dnigra") 

#set path where data is located
path <- "Z:/Dnigra" 

mc <- 375.3 #mc is the calculated target mass
limit<- 0.1 # the width of the search window

#finds the files with the correct extensions
fs <-list.files(path, pattern=glob2rx("*.txt$")) 
for (f in fs){
  fname <- file.path(path, f)
  df <- read_tsv(fname,col_names=FALSE, skip =1)

  #filters the data that includes the target mass
  df <- between(mc,limit,limit)

  #create new data based on contents
  allSpectra <- data.frame(df,f)

  #write new data to sep file
  write.table(allSpectra ,"allwobble.csv",
              append= T,
              sep=",",
              row = F
          )
}

Конечным результатом является таблица с:

df f
FALSE filename

Также ошибки:

Parsed with column specification: cols( X1 = col_character(), X2 = col_character() ) Warning: 2536 parsing failures.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Спасибо @ Бен. Я дошел до этого вчера вечером и добавил расчет толерантности. "Dd" определенно помог, но требовал, чтобы col_names прошел через другую ошибку. Окончательный код ниже. Ошибка синтаксического анализа, но она делает то, что нужно сделать!

tol<- .02 # the width of the search window
  mmneg <- mc - tol
  mmpos <- mc + tol

#finds the files with the correct extensions
fs <-list.files(path, pattern=glob2rx("*.txt$")) 
for (f in fs){
  fname <- file.path(path, f)
  df <- read_tsv(fname, skip =1,skip_empty_rows = T, col_types="dd", col_names=c("X1","X2"))

  #filters the data that excludes the offending peak
  df<- filter(df,between(X1,mmneg,mmpos))

  #create new data based on contents
  allSpectra <- data.frame(df,f)

  #write new data to sep file
  write.table(allSpectra ,"Caviunin_20_.csv",
              append= T,
              sep=",",
              row = F,
              col.names = F
  )
}
0 голосов
/ 08 ноября 2019

Я думаю, что здесь может быть несколько вещей для адреса:

Во-первых, с read_tsv вы можете указать типы столбцов как double, если это уместно, поэтому значения не считываются как символыстроки. Это повлияет на вашу способность фильтровать и подмножество на основе Mass.

Далее, оператор between имеет синтаксис:

between(x, left, right)

, где x <= right и x >= left,Если вы хотите убедиться, что значение mc находится между 375.2 и 375.4, вы можете вместо этого выбрать between(X1, mc-limit, mc+limit). Обратите внимание, что поскольку заголовок не был прочитан, переменная Mass сначала считается X1.

Когда вы используете write.table и добавляете, вы можете установить col.names в FALSE (или включите заголовок при первой записи).

Надеюсь, это полезно для вас.

for (f in fs){
  fname <- file.path(path, f)
  df <- read_tsv(fname, col_names = FALSE, skip=1, col_types = "dd")

  #filters the data that includes the target mass
  df <- filter(df, between(X1, mc-limit, mc+limit))

  #create new data based on contents
  allSpectra <- data.frame(df,f)

  #write new data to sep file
  write.table(allSpectra ,"allwobble.csv",
              append= T,
              sep=",",
              row = F,
              col.names = FALSE
  )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...