将大型且不常见的文件导入R

11

我是第一次在这里发帖,所以我会尽量清楚地表达我需要的帮助。我对R相当新,这是我的第一个真正独立编程的经验。

我有大约2.5年的股票tick数据,每天都有自己的文件。这些文件是.txt格式,包含大约20-30百万行数据,平均每个文件大约有360MB。我现在只处理一个文件。我不需要这些文件中包含的所有数据,并且我希望使用编程来将文件压缩一下。

现在我的问题是,我在编写正确的代码时遇到了一些困难,以便让R理解我想要它做什么。

首先让我给您展示一些数据,以便您了解其格式。

M977
R 64266NRE1VEW107 FI0009653869 2EURXHEL 630 1
R 64516SSA0B 80SHB SE0002798108 8SEKXSTO 40 1
R 645730BBREEW750 FR0010734145 8EURXHEL 640 1
R 64655OXS1C 900SWE SE0002800136 8SEKXSTO 40 1
R 64663OXS1P 450SWE SE0002800219 8SEKXSTO 40 1
R 64801SSIEGV LU0362355355 11EURXCSE 160 1
M978

另一段数据片段:

M732
D 3547742
A 3551497B 200000 67110 02800
D 3550806
D 3547743
A 3551498S 250000 69228 09900

如您所见,每一行都以一个字母开头。每个字母代表了这一行的含义。例如,R表示订单簿目录消息,M表示上一秒之后的毫秒数,H表示股票交易行动消息。总共使用了14个不同的字母。

我使用了readLines函数将数据导入R中。但是当我想要处理数据时,这似乎需要R花费很长时间。

现在,我想编写一些if函数来判断如果第一个字母是R,那么从偏移量1到4的代码意味着市场段标识符等,并让R添加这些列,以便我可以更加有结构地处理数据。

最佳的导入此类数据和创建某种形式的结构的方法是什么?例如,使用数据中的唯一ID信息逐个分析一只股票。

2个回答

1
你可以尝试类似这样的东西:
options(stringsAsFactors = FALSE)

f_A <- function(line,tab_A){
  values <- unlist(strsplit(line," "))[2:5]
  rbind(tab_A,list(name_1=as.character(values[1]),name_2=as.numeric(values[2]),name_3=as.numeric(values[3]),name_4=as.numeric(values[4])))
}

tab_A <- data.frame(name_1=character(),name_2=numeric(),name_3=numeric(),name_4=numeric(),stringsAsFactors=F)

for(i in readLines(con="/home/data.txt")){
    switch(strsplit(x=i,split="")[[1]][1],M=cat("1\n"),R=cat("2\n"),D=cat("3\n"),A=(tab_A <- f_A(i,tab_A)))
}

cat()替换为不同的函数,以向每种数据框添加值。使用函数f_A()的模式构建其他函数,并对表结构执行相同的操作。


感谢您的回复。我已经能够将行拆分,但只是针对整个数据。我使用了以下代码:starts = c(1,16,30,38,46,50,54) ends = c(14,28,35,43,47,50,55) ldata = length(data) lstarts = length(starts) x = substring(data,rep(starts,rep(ldata,lstarts)),rep(ends,rep(ldata,lstarts))) matrix(x,ncol=lstarts)是否可以将此代码分配给每个初始值?我尝试在每个字母后面写出它,但似乎不起作用。感谢您的反馈。 - Morten

0
你可以将readLines()命令与正则表达式结合使用。要获取有关正则表达式的更多信息,请查看R帮助站点中的grep()
> ?grep

所以您可以遍历所有行,检查每一行的含义,然后根据您的喜好处理或存储该行的内容。(正则表达式也可用于拆分一行中的数据...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接