在r中读取一个数字作为单个字符

时间:2014-04-29 10:01:34

标签: r

我有一个类似

的输入文件
222222222224444444444444444477777777777723548464646
233333333224444444444444444477776666667723545864646

当我用读取表命令将其读入r时, R 认为它是1列中的单个数字。但是,我需要为每个单个字符添加一列

2 2 2 2 2   2

...

有没有办法在** ** R?

中执行此操作

4 个答案:

答案 0 :(得分:3)

您可以将其视为固定宽度文件,并使用read.fwf打开,为width参数提供1的向量与(最大)字符数相同的长度每行:

read.fwf("yourFilename", rep(1, chars))

其中yourFilename是您文件的名称,chars是每行的字符数(在您的示例中为51)。

如果任何行的字符数少于您设置的chars值,则会为其赋予值NA

答案 1 :(得分:2)

首先,使用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

答案 2 :(得分:2)

只是添加真正意想不到的基准测试结果(我的道歉,jbaums):

仅提供2条线:

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

这实际上意味着你不应该使用固定宽度格式,它实际上非常慢。

答案 3 :(得分:-1)

这会诀窍吗?

unlist(strsplit("123", split=""))