I have an input file which looks like
222222222224444444444444444477777777777723548464646
233333333224444444444444444477776666667723545864646
当我使用Read table命令将其读入R时,R认为它是一个包含在1列中的单个数字。然而,我需要每个单独字符都有一列。
2 2 2 2 2 2
...
有没有一种方法可以用R来做到这一点?
I have an input file which looks like
222222222224444444444444444477777777777723548464646
233333333224444444444444444477776666667723545864646
2 2 2 2 2 2
...
read.fwf
打开,将width
参数设置为一个长度与每行字符数(最大值)相同的1
向量:read.fwf("yourFilename", rep(1, chars))
其中yourFilename
是您的文件名,chars
是每行字符数(在您的示例中为51)。
如果任何行的字符数少于您设置的chars
值,则它们将被赋值为NA
。
首先,可以使用readLines
函数最方便地读取数据。然后,您可以使用strsplit
函数将每个字符串(数字序列)轻松分成单个数字。
这里有一个例子(我首先将虚拟数据写入临时文件f
):
cat('222222222224444444444444444477777777777723548464646
233333333224444444444444444477776666667723545864646', file=f <- tempfile())
d <- readLines(f)
apply(do.call(rbind, strsplit(d, '')), 2, as.numeric)
data.frame
中(使用do.call(rbind, ...)
)。最后,我们将其强制转换为数字。如果您希望将对象保留为字符数据,则可以将其保留为do.call(rbind, strsplit(d, ''))
。?strplit
。read.fwf
更简单,但是关于你复制粘贴的评论,为什么不建议使用呢?我认为你会发现 read.fwf
也使用了 readLines
。 - jbaumsreadLines
不会决定任何colClasses
或查找注释,因此通过使用colClasses="character"
和comment.char=""
可以改进read.fwf
,但这似乎会减慢速度! - ping补充一下非常意外的基准测试结果(对不起,jbaums):
仅针对提供的两行代码:
Unit: microseconds
expr min lq median uq max neval
jbaums() 265.131 290.2255 307.573 349.1005 1793.644 100
fwf() 1627.021 1700.5955 1791.578 1986.1865 4910.790 100
对于3000行代码:
Unit: milliseconds
expr min lq median uq max neval
jbaums() 33.50519 38.47324 41.33132 47.05635 85.21228 100
fwf() 671.91310 693.56500 707.83914 724.06571 799.11987 100
这样行吗?
unlist(strsplit("123", split=""))