首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理将文件加载到R,同时使用“sqldf”排除坏行

批处理将文件加载到R,同时使用“sqldf”排除坏行
EN

Stack Overflow用户
提问于 2015-10-08 18:39:34
回答 1查看 408关注 0票数 1

我有一块R代码,递归地加载、整理和导出目录中的所有.txt文件(文件是制表符分隔的,但我使用read.fwf删除列)。该代码适用于经过9行不必要的头的完整数据的.txt文件。但是,当我用完整的.txt文件集(>500)将代码扩展到目录时,我发现有些文件的数据中嵌入了错误的行(基本上是自动重复几行头行,示例可用的这里)。我尝试过加载所有行,包括好行和坏行,目的是从R中删除坏行,但是得到关于列号的错误消息。

原始错误:使用read.fwf进行批处理加载(注意:我只需要每个.txt文件的前三列)

代码语言:javascript
复制
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的批处理预处理

代码语言:javascript
复制
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”的单个文件预处理

代码语言:javascript
复制
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中的坏行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

代码语言:javascript
复制
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:

代码语言:javascript
复制
DF <- read.table(text = grep("\260", readLines(File), value = TRUE), 
        sep = "\t", as.is = TRUE)[-c(1, 3)]

3)交替尝试以下方法,这比(2)更有效,但涉及指定colClasses矢量:

代码语言:javascript
复制
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的评论也适用于此:

代码语言:javascript
复制
DF <- read.table(pipe(paste("grep [\260]", File)), 
        sep = "\t", as.is = TRUE, colClasses = colClasses)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33023526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档