【问题标题】:read in matrix into r without delimination将矩阵读入 r 而不进行分隔
【发布时间】:2015-04-10 19:17:36
【问题描述】:

我想读入 R 的文件看起来像这样

0010101010101010101
1110101010101010101
1111110101010111000
0001010101000010100

当我读到问题是 R 认为每一行都是一个数字并且只显示

   V1
1 Inf
2 Inf
3 Inf
4 Inf
5 Inf
6 Inf

我如何将它作为一个包含 0 和其他元素的矩阵读取?

【问题讨论】:

    标签: r matrix dataframe


    【解决方案1】:

    一个选项是

    as.matrix(read.fwf('triub.txt', widths=rep(1,19)))
    #    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19
    #[1,]  0  0  1  0  1  0  1  0  1   0   1   0   1   0   1   0   1   0   1
    #[2,]  1  1  1  0  1  0  1  0  1   0   1   0   1   0   1   0   1   0   1
    #[3,]  1  1  1  1  1  1  0  1  0   1   0   1   0   1   1   1   0   0   0
    #[4,]  0  0  0  1  0  1  0  1  0   1   0   0   0   0   1   0   1   0   0
    

    或者

    as.matrix(read.table(text=gsub("", ' ', readLines('triub.txt'))))
    #    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19
    #[1,]  0  0  1  0  1  0  1  0  1   0   1   0   1   0   1   0   1   0   1
    #[2,]  1  1  1  0  1  0  1  0  1   0   1   0   1   0   1   0   1   0   1
    #[3,]  1  1  1  1  1  1  0  1  0   1   0   1   0   1   1   1   0   0   0
    #[4,]  0  0  0  1  0  1  0  1  0   1   0   0   0   0   1   0   1   0   0
    

    或者你可以pipesedawk(在linux

     as.matrix(read.table(pipe("sed 's/./& /g' triub.txt"), header=FALSE))
     #    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19
     #[1,]  0  0  1  0  1  0  1  0  1   0   1   0   1   0   1   0   1   0   1
     #[2,]  1  1  1  0  1  0  1  0  1   0   1   0   1   0   1   0   1   0   1
     #[3,]  1  1  1  1  1  1  0  1  0   1   0   1   0   1   1   1   0   0   0
     #[4,]  0  0  0  1  0  1  0  1  0   1   0   0   0   0   1   0   1   0   0
    
    as.matrix(read.table(pipe("awk 'BEGIN{FS=\"\"; OFS=\" \"}{$1=$1}1' triub.txt"),
         header=FALSE))
    

    【讨论】:

      【解决方案2】:

      您可以将其视为固定数据文件并使用新的readr 库。

      library(readr)
      read_fwf("0010101010101010101
      1110101010101010101
      1111110101010111000
      0001010101000010100", fwf_widths(rep(1,19)))
      

      这会返回一个 data.frame,您可以使用 as.matrix 将其转换为矩阵

      或者您可以读取行并拆分(如果您提前不知道列数,则很有用)

      tx<-textConnection("0010101010101010101
      1110101010101010101
      1111110101010111000
      0001010101000010100")
      
      
      do.call(rbind, lapply(strsplit(readLines(tx), strsplit, split=""), as.numeric))
      
      close(tx)
      

      注意我这里只使用textConnection() 来做一个可重现的例子。您可以将readLines("filename.txt") 用于您的真实数据文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-06
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 2016-08-18
        • 2013-01-22
        相关资源
        最近更新 更多