0

我确实意识到已经提出了类似的问题,但是鉴于提供的答案都没有解决我的问题,沮丧开始出现。问题如下:我有 27 个形状相同的时间序列数据(日期、开放、高、低,最后)以 txt 格式,我想将它们作为 .txt 文件导入 R 中,这样读取的第一行就是包含所有 5 个数据的行。下面给出的示例显示,虽然文本文件中的数据从 1984 年 1 月 3 日开始,但我希望从 1990 年 11 月 5 日开始读取文件(因为较早的日期缺少 Open),将日期的第一列保存为rownames 并将其他 4 列保存为数字,并为每一列提供明显的名称。

            Open    High    Low     Last
1984-01-03         1001.40  997.50  997.50
1984-01-04         999.50   993.30  998.60

1990-11-05  2038.00 2050.20 2038.00 2050.10
1990-11-06  2055.00 2071.00 2052.20 2069.80

鉴于这是一个常见问题,我尝试了以下代码:

    ftse <- read.table("FTSE.txt", sep="", quote="", dec=".", as.is=TRUE,   
               blank.lines.skip=TRUE, strip.white=TRUE,na.strings=c("","NA"),
               row.names=1, col.names=c("Open","High","Low","Last"))

我已经尝试了各种组合,还指定了 colClasses、header=TRUE 和其他命令(对于 fill=TRUE,实际读取了数据,但这正是我不想要的)但我总是收到以下错误(或错误消息中的行不同)

    Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
    line 1731 did not have 4 elements

第 1731 行对应于日期 1984-01-03。我很乐意寻求帮助,因为我不能在这些问题上浪费更多时间,所以请提供我如何解决这个问题的建议。先感谢您。

4

1 回答 1

0

我不知道一般解决方案可能是什么,但 readLines 和 read.fwf 的组合可能适用于您的情况:

ftse.lines <- readLines("FTSE.txt")
ftse.lines <- ftse.lines[ftse.lines != ""] # skip empty lines
ftse <- read.fwf(textConnection(ftse.lines), widths=c(11,8,8,8,8), skip=1, row.names=1)
names(ftse) <- c("Open", "Hi", "Lo", "Last")

您可能需要修改某些部分,但它适用于您的示例。

以下(仅使用 read.fwf)也有效:

 ftse <- read.fwf("FTSE.txt", widths=c(11,8,8,8,8), col.names=c("blah", "Open", "Hi", "Lo", "Last"), skip=1)

如果确实需要,然后尝试将第一个 col 转换为 rownames。

于 2014-05-17T13:16:36.727 回答