我有一个类似
的输入文件222222222224444444444444444477777777777723548464646
233333333224444444444444444477776666667723545864646
当我用读取表命令将其读入r时, R 认为它是1列中的单个数字。但是,我需要为每个单个字符添加一列
2 2 2 2 2 2
...
有没有办法在** ** R?
中执行此操作答案 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=""))