#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
при записи, но это сработало прекрасно. Спасибо!