我有一块R代码,递归地加载、整理和导出目录中的所有.txt文件(文件是制表符分隔的,但我使用read.fwf删除列)。该代码适用于经过9行不必要的头的完整数据的.txt文件。但是,当我用完整的.txt文件集(>500)将代码扩展到目录时,我发现有些文件的数据中嵌入了错误的行(基本上是自动重复几行头行,示例可用的这里)。我尝试过加载所有行,包括好行和坏行,目的是从R中删除坏行,但是得到关于列号的错误消息。
原始错误:使用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‘排除坏行。
修复尝试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修复尝试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中的坏行?
发布于 2015-10-09 18:04:45
这里有一些方法。它们都利用了这样一个事实:好的行都包含度符号(八进制260),而垃圾线不包含。在所有这些中,我们假设第1和第3列将被删除。
1) --这段代码假设您有grep,但是您可能需要引用grep的第一个参数,这取决于您的grep。(在Windows上,要获得grep,您需要安装Rtools,在普通的Rtools下安装grep可以在这里找到:C:\\Rtools\bin\grep.exe。Rtools bin目录必须放在Windows路径上,否则在引用Rtools时需要使用整个路径名。)这些注释只适用于(1)和(4),因为(2)和(3)不使用系统的grep。
File <- "2008NOV28_MORNING_trunc.txt"
library(sqldf)
DF <- read.csv.sql(File, header = FALSE, sep = "\t", eol = "\n",
sql = "select V2, V4, V5, V6, V7, V8, V9 from file",
filter = "grep [\260] ")2) --为此您可能不需要sqldf:
DF <- read.table(text = grep("\260", readLines(File), value = TRUE),
sep = "\t", as.is = TRUE)[-c(1, 3)]3)交替尝试以下方法,这比(2)更有效,但涉及指定colClasses矢量:
colClasses <- c("NULL", NA, "NULL", NA, NA, NA, NA, NA, NA)
DF <- read.table(text = grep("\260", readLines(File), value = TRUE),
sep = "\t", as.is = TRUE, colClasses = colClasses)4)我们也可以在`read.table中使用系统的grep。(1)关于grep的评论也适用于此:
DF <- read.table(pipe(paste("grep [\260]", File)),
sep = "\t", as.is = TRUE, colClasses = colClasses)https://stackoverflow.com/questions/33023526
复制相似问题