[R] speeding read.table
arun
smartpink111 at yahoo.com
Fri Oct 19 04:56:20 CEST 2012
HI,
You can also try this.
Should remove the problematic lines, but it may not match up to Rui's method in terms of speed.
input<-readLines(textConnection("TABLE NO. 1
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9 COL10 COL11 COL12
1.0010E+05 0.0000E+00 1.0000E+00 1.0000E+03 -1.0000E+00 1.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
1.0010E+05 1.0001E+01 1.0000E+00 1.0000E+03 -1.0000E+00 1.0000E+00 2.2737E-14 -2.2737E-14 0.0000E+00 1.9281E-08 0.0000E+00 0.0000E+00
1.0010E+05 2.4000E+01 1.0000E+00 2.0000E+03 -1.0000E+00 1.0000E+00 5.7541E-15 -5.7541E-15 0.0000E+00 5.1115E-13 0.0000E+00 0.0000E+00
TABLE NO. 1
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9 COL10 COL11 COL12
1.0010E+05 0.0000E+00 1.0000E+00 1.0000E+03 -1.0000E+00 1.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
1.0010E+05 1.0001E+01 1.0000E+00 1.0000E+03 -1.0000E+00 1.0000E+00 2.2737E-14 -2.2737E-14 0.0000E+00 1.9281E-08 0.0000E+00 0.0000E+00
1.0010E+05 2.4000E+01 1.0000E+00 2.0000E+03 -1.0000E+00 1.0000E+00 5.7541E-15 -5.7541E-15 0.0000E+00 5.1115E-13 0.0000E+00 0.0000E+00
"))
dat1<-do.call(rbind,lapply(lapply(input[grep("\\d+",input)][grepl("[\\d+]",input[grep("\\d+",input)])],function(x) unlist(strsplit(x, split=" +"))),function(x) unlist(strsplit(x, split="+ "))))
dat2<-data.frame(dat1)
dat2[]<-sapply(dat2,function(x) as.numeric(as.character(x)))
names(dat2)<-lapply(strsplit(input[grepl("COL{0,1}",input)]," +"),function(x) unlist(strsplit(x,"+ ")))[[1]]
dat2
# COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9 COL10
#1 100100 0.000 1 1000 -1 1 0.0000e+00 0.0000e+00 0 0.0000e+00
#2 100100 10.001 1 1000 -1 1 2.2737e-14 -2.2737e-14 0 1.9281e-08
#3 100100 24.000 1 2000 -1 1 5.7541e-15 -5.7541e-15 0 5.1115e-13
#4 100100 0.000 1 1000 -1 1 0.0000e+00 0.0000e+00 0 0.0000e+00
#5 100100 10.001 1 1000 -1 1 2.2737e-14 -2.2737e-14 0 1.9281e-08
#6 100100 24.000 1 2000 -1 1 5.7541e-15 -5.7541e-15 0 5.1115e-13
# COL11 COL12
#1 0 0
#2 0 0
#3 0 0
#4 0 0
#5 0 0
#6 0 0
A.K.
----- Original Message -----
From: Fisher Dennis <fisher at plessthan.com>
To: r-help at stat.math.ethz.ch
Cc:
Sent: Thursday, October 18, 2012 9:57 AM
Subject: [R] speeding read.table
R 2.15.1
OS X
Colleagues,
I am reading a 1 GB file into R using read.table. The file consists of 100 tables, each of which is headed by two lines of characters.
The first of these lines is:
TABLE NO. 1
The second is a list of column headers.
For example:
TABLE NO. 1
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9 COL10 COL11 COL12
1.0010E+05 0.0000E+00 1.0000E+00 1.0000E+03 -1.0000E+00 1.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
1.0010E+05 1.0001E+01 1.0000E+00 1.0000E+03 -1.0000E+00 1.0000E+00 2.2737E-14 -2.2737E-14 0.0000E+00 1.9281E-08 0.0000E+00 0.0000E+00
1.0010E+05 2.4000E+01 1.0000E+00 2.0000E+03 -1.0000E+00 1.0000E+00 5.7541E-15 -5.7541E-15 0.0000E+00 5.1115E-13 0.0000E+00 0.0000E+00
Later something similar appears:
TABLE NO. 1
COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9 COL10 COL11 COL12
1.0010E+05 0.0000E+00 1.0000E+00 1.0000E+03 -1.0000E+00 1.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
1.0010E+05 1.0001E+01 1.0000E+00 1.0000E+03 -1.0000E+00 1.0000E+00 2.2737E-14 -2.2737E-14 0.0000E+00 1.9281E-08 0.0000E+00 0.0000E+00
1.0010E+05 2.4000E+01 1.0000E+00 2.0000E+03 -1.0000E+00 1.0000E+00 5.7541E-15 -5.7541E-15 0.0000E+00 5.1115E-13 0.0000E+00 0.0000E+00
I will use the term "problematic lines" to refer to the repeated occurrences of the two non-data lines
read.table is not successful in reading the table because of these problematic lines (I get around the first "TABLE NO." line using the skip option)
My word-around has been to:
1. read the table with readLines
2. remove the problematic lines
3. write the file to disk
4. read the file with read.table.
However, this process is slow.
I though about using "comment.char" as a means of avoiding reading the problematic lines. However, comment.char does not accept ="[A-Z]"
Are there any clever workarounds for this?
Dennis
Dennis Fisher MD
P < (The "P Less Than" Company)
Phone: 1-866-PLessThan (1-866-753-7784)
Fax: 1-866-PLessThan (1-866-753-7784)
www.PLessThan.com
______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list