2012-07-26 18 views
11

第一次在这里发布海报,所以我会尽量让自己尽可能清楚地了解我需要的帮助。我对R相当陌生,这是我第一次真正的独立编程经验。将大的不寻常的文件导入到R

我有大约2.5年的股票价格数据,每天都有自己的文件。这些文件是.txt,包含大约2000万到3000万行,平均而言,我猜每个文件都是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信息来分析1个股票。

回答

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))) 
} 

而且由值添加到每种类型data.frame不同的功能取代cat()。使用函数f_A()的模式为表结构构造其他函数和相同的东西。

+0

感谢您的回复。我已经能够分割行,但仅限于整个数据。我已经使用以下代码 '代码 starting = c(1,16,30,38,46,50,54) ends = c(14,28,35,43,47,50,55) ldata = length(data) lstarts =长度(开始) x = substring(数据,rep(开始,rep(ldata,lstarts)),rep(结束,rep(ldata,lstarts))) matrix(x,ncol = lstarts)' 是否可以将这种编码分配给每个初始值?我试图在每封信后写出来,但似乎并不奏效。感谢您的反馈 – Morten 2012-08-01 10:22:56

0

您可以将您的readLines()命令与正则表达式结合使用。要获取有关正则表达式的更多信息,请于R帮助网站grep()

> ?grep 

所以你可以通过所有的线,检查每一行是什么意思,然后再处理或存储行的内容不过你喜欢。 (正则表达式也可用于在一行内分割数据...)