У меня есть фрагмент кода R, который рекурсивно загружает, упорядочивает и экспортирует все .txt-файлы в каталог (файлы разделены табуляцией, но я использовал read.fwf для удаления столбцов). Код работает для файлов .txt с полными данными после 9 строк ненужных заголовков. Однако, когда я расширил код до каталога с полным набором файлов .txt (> 500), я обнаружил, что некоторые из файлов имеют плохие строки, встроенные в данные (по существу, автоматические повторы нескольких строк заголовков, выборки доступны here). Я попытался просто загрузить все строки, как хорошие, так и плохие, с целью удаления плохих строк из R, но получить сообщения об ошибках о номерах столбцов.Пакетная загрузка файлов в R, исключая неудачные строки с использованием sqldf
Оригинальная ошибка: Пакетная загрузка с помощью read.fwf (Примечание: нужно только первые три столбца из каждого файла .txt)
setwd("C:/Users/Seth/Documents/testdata")
library(stringr)
filesToProcess <- dir(pattern="*.txt", full.names=T)
listoffiles <- lapply(filesToProcess, function(x) read.fwf (x,skip=9, widths=c(10,20,21), col.names=c("Point",NA,"Location",NA,"Time"), stringsAsFactors=FALSE))
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 344 did not have 5 elements #error from bad rows
Далее я попытался предварительной обработки данных, чтобы исключить плохие строки с использованием 'sqldf'.
Fix попытка 1: Пакетное предварительной обработки с использованием '' sqldf
library(sqldf)
listoffiles <- lapply(filesToProcess, function(x) read.csv.sql(x, sep="\t",
+ skip=9,field.types=c("Point","Location","Time","V4","V5","V6","V7","V8","V9"),
+ header=F, sql = "select * from file where Point = 'Trackpoint' "))
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 1 did not have 9 elements
Fix попытка 2: Один файл предварительной обработки с использованием 'sqldf'
test.v1 <- read.csv.sql("C:/Users/Seth/Documents/testdata/test/2008NOV28_MORNING_Hunknown.txt",
+ sep="\t", skip=9,field.types=c("Point","Location","Time","V4","V5","V6","V7","V8","V9"),
+ header=F, sql = "select * from file where Point = 'Trackpoint' ")
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 1 did not have 9 elements
Я бы предпочитают делать это чисто и использовать что-то вроде «sqldf» или «dplyr», но я открыт, чтобы вытащить все строки, а затем выполнить постпроцесс внутри R. Мои вопросы: Как исключить неверные строки данных во время импорта? Или, как мне получить полный набор данных, импортированных, а затем удалить плохие строки внутри R?
Вы должны понимать, что тег 'batch-file' имеет _no_ отношение к вашей проблеме и удаляет его ... – Aacini
Спасибо, @Aacini. Было предложено Стеком, и я ошибался, чтобы включить его. –
'read.sql.csv' поддерживает ключевое слово' filter = '. См. '? Read.csv.sql' и'? Sqldf''. –