1
votes

I have a matrix in a file in the following format:

         V1        V2        V3        V4        V5       V6        V7
[1,] 17.67787 12.375978 12.007860 16.089949 24.864464 37.64243 42.711561
 ...
[10,] 42.89655 21.535867  7.975470  6.580414 10.326551 11.06297 11.201733
        V8       V9      V10       V11       V12       V13       V14
[1,] 30.41993 35.46864 16.97427 10.992030 11.408483 17.417670 33.815149
 ...
[10,]

10 rows and N column vectors laid out in sets of 7 columns.

How would one go about reading this into R as a matrix?

scan is throwing an error:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  scan() expected 'a real', got 'V1'

If I try to call "as.matrix(read.table(..))"

I get:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  line 11 did not have 8 elements
2
I think it would be helpful to post an actual head -11 of the file in question. Having said that, if additional column headers (like V9- V16) are really interspersed within the file, then you'll need to use readLines, roll up your sleeves and do some post-processing.hrbrmstr
Editing my post to include an actual extract of the files I need to read in.tanbog
@akun I get: Error in read.table("centroid0.txt", fill = TRUE, header = TRUE) : duplicate 'row.names' are not allowedtanbog
@raf please check my solution below. I just copied the data from pastebin and run it using readLines(textConnection( or you can just read it from file by readLines("name.txt")akrun

2 Answers

1
votes

You could try:

 lines <- readLines(textConnection("V1 .... #... all the data you showed in `pastebin`
                 ...   33.21421"))

If you are reading it from a file

 lines <- readLines("raf.txt")
 lines1 <- gsub("\\[.*]","",lines) #remove the `[,number]` part in the beginning
 library(stringr)
 lines2 <- str_trim(lines1) #remove the trailing/leading spaces

Here, I am splitting the lines2 into groups in a list using an index created by grep and cumsum so that each set of new group has a header and the data. Then read the files in the list using lapply and read.table

  lst1 <- lapply(split(lines2, cumsum(grepl("^V", lines2))), 
                  function(x) read.table(text=x, header=TRUE))
  names(lst1) <- NULL
  res <- do.call(`cbind`, lst1)

If you want to convert it to matrix

 m1 <- as.matrix(res)
 dim(res)
 #[1]  10 128

 res[1:3,1:3]
 #       V1       V2       V3
 #1 17.67787 12.37598 12.00786
 #2 29.44688 19.44888 15.06014
 #3 30.49377 19.64495 11.15946
0
votes

I built a text object, 'txt', that conforms to your original description.

dput(txt)
"         V1    V2    V3    V4    V5    V6    V7    V8\n [1] 10074 10146 10079 10091 10040 10066 10009 10152\n [2] 10137 10136 10032 10139 10038 10122 10123 10095\n [3] 10046 10120 10062 10061 10149 10029 10030 10059\n [4] 10003 10028 10148 10050 10057 10100 10144 10084\n [5] 10076 10012 10114 10073 10026 10135 10130 10083\n [6] 10007 10119 10063 10078 10086 10160 10125 10087\n [7] 10031 10090 10021 10092 10093 10067 10106 10129\n [8] 10004 10102 10113 10134 10042 10064 10037 10140\n [9] 10101 10156 10060 10121 10097 10002 10109 10033\n[10] 10075 10096 10024 10089 10115 10147 10036 10103\n         V9   V10   V11   V12   V13   V14   V15   V16\n [1] 10153 10107 10049 10143 10047 10126 10039 10018\n [2] 10065 10127 10048 10133 10108 10124 10117 10077\n [3] 10105 10051 10131 10069 10098 10058 10088 10006\n [4] 10132 10104 10112 10138 10128 10027 10043 10145\n [5] 10010 10072 10151 10111 10110 10052 10020 10082\n [6] 10023 10016 10044 10158 10159 10041 10155 10019\n [7] 10099 10008 10094 10142 10045 10068 10070 10015\n [8] 10013 10080 10053 10071 10085 10014 10056 10034\n [9] 10022 10011 10150 10054 10154 10035 10081 10118\n[10] 10116 10055 10017 10005 10025 10157 10141 10001"

 tcon <- textConnection(txt) # the first description did not have commas

In place of txt you can substitute a file() call; the principle being that you can read incrementally for a connection:

 cbind( read.table(text= readLines(tcon,n=11), header=TRUE),  # first 11 lines
        read.table(text= readLines(tcon,n=11), header=TRUE))  # second 11

        V1    V2    V3    V4    V5    V6    V7    V8
[1]  10074 10146 10079 10091 10040 10066 10009 10152
[2]  10137 10136 10032 10139 10038 10122 10123 10095
[3]  10046 10120 10062 10061 10149 10029 10030 10059
[4]  10003 10028 10148 10050 10057 10100 10144 10084
[5]  10076 10012 10114 10073 10026 10135 10130 10083
[6]  10007 10119 10063 10078 10086 10160 10125 10087
[7]  10031 10090 10021 10092 10093 10067 10106 10129
[8]  10004 10102 10113 10134 10042 10064 10037 10140
[9]  10101 10156 10060 10121 10097 10002 10109 10033
[10] 10075 10096 10024 10089 10115 10147 10036 10103
        V9   V10   V11   V12   V13   V14   V15   V16
[1]  10153 10107 10049 10143 10047 10126 10039 10018
[2]  10065 10127 10048 10133 10108 10124 10117 10077
[3]  10105 10051 10131 10069 10098 10058 10088 10006
[4]  10132 10104 10112 10138 10128 10027 10043 10145
[5]  10010 10072 10151 10111 10110 10052 10020 10082
[6]  10023 10016 10044 10158 10159 10041 10155 10019
[7]  10099 10008 10094 10142 10045 10068 10070 10015
[8]  10013 10080 10053 10071 10085 10014 10056 10034
[9]  10022 10011 10150 10054 10154 10035 10081 10118
[10] 10116 10055 10017 10005 10025 10157 10141 10001

This does the same actions on a longer file. And conversion to a matrix remains trivial:

txt <-readLines(file("~/Downloads/YjwpsANG.txt"))
tcon <-textConnection(txt)
X <- cbind(  read.table(text= readLines(tcon,n=11), header=TRUE), 
read.table(text= readLines(tcon,n=11), header=TRUE),
read.table(text= readLines(tcon,n=11), header=TRUE),
 read.table(text= readLines(tcon,n=11), header=TRUE),
read.table(text= readLines(tcon,n=11), header=TRUE), 
read.table(text= readLines(tcon,n=11), header=TRUE),
read.table(text= readLines(tcon,n=11), header=TRUE), 
read.table(text= readLines(tcon,n=11), header=TRUE),
read.table(text= readLines(tcon,n=11), header=TRUE), 
read.table(text= readLines(tcon,n=11), header=TRUE),
read.table(text= readLines(tcon,n=11), header=TRUE), 
read.table(text= readLines(tcon,n=11), header=TRUE),
read.table(text= readLines(tcon,n=11), header=TRUE), 
read.table(text= readLines(tcon,n=11), header=TRUE),
read.table(text= readLines(tcon,n=11), header=TRUE), 
read.table(text= readLines(tcon,n=11), header=TRUE),
read.table(text= readLines(tcon,n=11), header=TRUE), 
read.table(text= readLines(tcon,n=11), header=TRUE),
read.table(text= readLines(tcon,n=11), header=TRUE) )