读取矩阵到R

时间:2014-10-05 04:02:16

标签: r matrix vector

我在文件中有一个矩阵,格式如下:

         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行和N列向量以7列的形式排列。

如何将其作为矩阵读入R?

扫描引发错误:

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

如果我尝试拨打" as.matrix(read.table(..))"

我明白了:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  line 11 did not have 8 elements

2 个答案:

答案 0 :(得分:1)

你可以尝试:

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

如果您是从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

在这里,我使用由listgrep创建的索引将行2分成cumsum中的组,以便每组新组都有标题和数据。然后使用listlapply

阅读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)

如果要将其转换为矩阵

 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

答案 1 :(得分:0)

我构建了一个符合原始描述的文本对象'txt'

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

代替txt,您可以替换文件()调用;原则是您可以逐步读取连接:

 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

这对较长的文件执行相同的操作。转换为矩阵仍然是微不足道的:

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) )