Reputation: 121
I am trying to read text header files in R. I have been pretty successful except for the following:
One part of the file contains:
.
.
. (Other stuff)
spectra names = {
Endmember 1, Endmember 2, Endmember 3, Endmember 4, Endmember 5,
Endmember 6, Endmember 7, Endmember 8, Endmember 9, Endmember 10,
Endmember 11, Endmember 12, Endmember 13, Endmember 14, Endmember 15,
Endmember 16, Endmember 17, Endmember 18, Endmember 19, Endmember 20,
Endmember 21, Endmember 22, Endmember 23, Endmember 24, Endmember 25,
Endmember 26, Endmember 27, Endmember 28, Endmember 29, Endmember 30}
.
.
.
I want the output to be a list containing the names of the spectra, i.e. ["Endmember 1" "Endmember 2"
and so on...
I tried read.csv()
, read.table()
, but nothing seems to work. I am stumped by the ends of the lines and the '{', '}' characters
What I want to do is: start reading at "spectra names" and then store everything between the {}
as an array of strings as I mentioned above.
Upvotes: 1
Views: 144
Reputation: 121568
using scan and gsub as suggested in the comment , you can get easily this.
tt <- scan(text = "spectra names = {
Endmember 1, Endmember 2, Endmember 3, Endmember 4, Endmember 5,
Endmember 6, Endmember 7, Endmember 8, Endmember 9, Endmember 10,
Endmember 11, Endmember 12, Endmember 13, Endmember 14, Endmember 15,
Endmember 16, Endmember 17, Endmember 18, Endmember 19, Endmember 20,
Endmember 21, Endmember 22, Endmember 23, Endmember 24, Endmember 25,
Endmember 26, Endmember 27, Endmember 28, Endmember 29, Endmember 30}" ,what = 'character' ,sep =',')
gsub('[{|}]','',tt) ## not really clever but it is a good begining
[1] "spectra names = " " Endmember 1" " Endmember 2" " Endmember 3" " Endmember 4" " Endmember 5"
[7] " " " Endmember 6" " Endmember 7" " Endmember 8" " Endmember 9" " Endmember 10"
[13] " " " Endmember 11" " Endmember 12" " Endmember 13" " Endmember 14" " Endmember 15"
[19] " " " Endmember 16" " Endmember 17" " Endmember 18" " Endmember 19" " Endmember 20"
[25] " " " Endmember 21" " Endmember 22" " Endmember 23" " Endmember 24" " Endmember 25"
[31] " " " Endmember 26" " Endmember 27" " Endmember 28" " Endmember 29" " Endmember 30"
Upvotes: 1
Reputation: 13103
This is an example of how to implement Justin's suggestion. Suppose the data file looked like this:
4 5 6
2 3 4
1 2 3
spectra names = {Endmember 1, Endmember 2, Endmember 3}
1 1 1
1 1 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
2 2 2
You could read it like so:
aa <- readLines('c:/users/Mark W Miller/simple R programs/odd data file with headers in the middle.txt',
n = 4)
bb <- gsub("spectra names = {","", aa[4], fixed=TRUE)
bb <- gsub("}","", bb, fixed=TRUE)
bb <- gsub(" "," ", bb, fixed=TRUE)
bb <- gsub(", ",",", bb, fixed=TRUE)
cc <- unlist(strsplit(bb, ","))
cc
dd <- read.table('c:/users/Mark W Miller/simple R programs/odd data file with headers in the middle.txt',
skip = 4, header=F)
dd
colnames(dd) <- cc
dd
I am sure there are ways to condense all my gsub
statements into one line. If this does not do exactly what you want maybe you can use it as a start.
I was not sure I understood the part of creating a list for column names.
Upvotes: 1