使用R从csv文件(带有一些不一致性)创建zoo对象

时间:2012-03-05 16:58:54

标签: r csv zoo

我正在尝试从以下csv文件在R中创建一个zoo对象: http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/Skewdailyprices.csv

问题似乎是从2006年2月27日到2006年3月20日(一些额外的逗号和“x”)导致问题的时期存在一些小的不一致。

我正在寻找一种自动将完整的csv文件读入R的方法。每个工作日都有一个新的数据点,当进行手动预处理时,您每天都需要手动重新编辑文件。

我不确定这些是否是这个文件的唯一问题但是我已经没有想法如何在这个时间序列中创建一个动物园对象。我认为,通过对R的更多了解,它应该是可能的。

2 个答案:

答案 0 :(得分:5)

使用colClasses告诉它有4个字段并使用fill,因此如果任何行丢失,则知道填充它们。忽略警告:

library(zoo)
URL <- "http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/Skewdailyprices.csv"
z <- read.zoo(URL, sep = ",", header = TRUE, format = "%m/%d/%Y", skip = 1, 
         fill = TRUE, colClasses = rep(NA, 4))

答案 1 :(得分:3)

分离清洁和分析步骤是个好主意。由于您提到您的数据集经常更改,因此必须自动进行此清理。这是一种自动清洗的解决方案。

#Read in the data without parsing it
lines <- readLines("Skewdailyprices.csv")

#The bad lines have more than two fields 
n_fields <- count.fields(
  "Skewdailyprices.csv", 
  sep = ",", 
  skip = 1
)

#View the dubious lines
lines[n_fields != 2]

#Fix them
library(stringr) #can use gsub from base R if you prefer
lines <- str_replace(lines, ",,x?$", "")

#Write back out to file
writeLines(lines[-1], "Skewdailyprices_cleaned.csv")

#Read in the clean version
sdp <- read.zoo(
    "Skewdailyprices_cleaned.csv", 
    format = "%m/%d/%Y", 
    header = TRUE, 
    sep = ","
)