Удалить строки ниже порогового значения для всех текстовых файлов в каталоге

#r #batch-processing #delete-row

#r #пакетная обработка #удалить-строка

Вопрос:

У меня есть 800 текстовых файлов в формате X Y, где X и Y — оба числа. Мне нужно (1) удалить строки данных, где x<91 для каждого текстового файла, затем (2) записать новый текстовый файл на основе исходного имени файла.

Я успешно создал код tidyverse, который обрабатывает этот файл за файлом, что медленнее, чем просто вручную просматривать блокнот и удалять недопустимые строки данных. У меня возникли трудности с выполнением цикла кода по всем файлам в каталоге.

Вот мини-код:

 oldfile<- read_tsv(file='WD130887.txt',col_names=FALSE)
newfile<- filter(oldfile, X1>91)
write_tsv(newfile,path ='E:/Contract Data/Shorea2/edited/WD130887.txt')
  

и это работает именно так, как должно. Он помещает мой новый отредактированный файл в новый каталог, чтобы ничего не было перезаписано.
Вывод:

 > write_tsv(newfile,path ='E:/Contract Data/Shorea2/edited/Shorea sp_WD130887.txt')
> oldfile<- read_tsv(file='Shorea sp_WD130887.txt',col_names=FALSE)
Parsed with column specification:
cols(
  X1 = col_double(),
  X2 = col_double()
)
> head(oldfile,n=5)
# A tibble: 5 x 2
     X1     X2
  <dbl>  <dbl>
1  89.0  1502.
2  89.1  5791.
3  90.1 20390.
4  91.1   760.
5  93.0 11748.
> newfile<- filter(oldfile, X1>91)
> head(newfile,n=5)
# A tibble: 5 x 2
     X1     X2
  <dbl>  <dbl>
1  91.1   760.
2  93.0 11748.
3  94.1  5183.
4  95.0  4021.
5  95.1   864.
> write_tsv(newfile,path ='E:/Contract Data/Shorea2/edited/Shorea sp_WD130887.txt')
  

Моя попытка сделать это для всего каталога привела меня сюда:

 path <- "E:/Contract Data/Shorea2"
fs <-list.files(path, pattern=glob2rx("*.txt$")) #create list of my txt files
for (f in fs){
  fname <- file.path(path, f)
  df <- read_tsv(fname,col_names=FALSE) #open each txt file
  df <- filter(fname,X1>91) #apply tidyverse filter
  write_tsv(df, fname, row.names=FALSE) #write new txt file, I gave up on new directory
}
  

Но я получаю сообщение об ошибке:

 Error in UseMethod("filter_") : 
  no applicable method for 'filter_' applied to an object of class "character"
  

Я полагаю, это означает, что код теперь просматривает имена файлов, а не значения строк. Помощь приветствуется! Я уверен, что это простая проблема, и я упускаю что-то очевидное.

Комментарии:

1. filter первым аргументом должен быть data.frame / tibble . Попробуйте df <- filter(df, X1>91) вместо df <- filter(fname,X1>91) внутри вашего for цикла.

2. Мне также пришлось удалить row.names=FALSE при записи, но это сработало прекрасно. Спасибо!