【发布时间】: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 的文件看起来像这样
0010101010101010101
1110101010101010101
1111110101010111000
0001010101000010100
当我读到问题是 R 认为每一行都是一个数字并且只显示
V1
1 Inf
2 Inf
3 Inf
4 Inf
5 Inf
6 Inf
我如何将它作为一个包含 0 和其他元素的矩阵读取?
【问题讨论】:
一个选项是
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
或者你可以pipe 和sed 或awk(在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))
【讨论】:
您可以将其视为固定数据文件并使用新的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") 用于您的真实数据文件。
【讨论】: