从指定的值范围中导入CSV

时间:2017-11-06 16:30:03

标签: r csv data-manipulation

我正在尝试读取CSV文件,但我遇到了以下错误。

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  : 
  line 1097 did not have 5 elements

在进一步检查CSV文件后,我发现在第1097行附近有一个中断行并开始一个带有年度数据的新标题(我现在对每月感兴趣)。

temp <- tempfile()
download.file("http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Research_Data_Factors_CSV.zip",temp, mode="wb")
unzip(temp, "F-F_Research_Data_Factors.CSV")
French <- read.table("F-F_Research_Data_Factors.CSV", sep=",", skip = 3, header=T, nrows = 100)

以上代码下载zip文件并将CSV文件导入R中,前100行完美无缺。然而,前100行(为了说明目的)是20世纪20年代和30年代的数据点,这不是我特别感兴趣的。

我的问题是,如何从第一个逗号分隔的CSV文件中的值导入数据,即192607(1926-07),直到说195007(1950-07) - 我能够通过更改导入最新的值nrow = 1095但这不是我想要实现的目标。

数据快照;

,Mkt-RF,SMB,HML,RF
192607,    2.96,   -2.30,   -2.87,    0.22
192608,    2.64,   -1.40,    4.19,    0.25
192609,    0.36,   -1.32,    0.01,    0.23

......第1100行

 Annual Factors: January-December 
,Mkt-RF,SMB,HML,RF
  1927,   29.47,   -2.46,   -3.75,    3.12
  1928,   35.39,    4.20,   -6.15,    3.56

2 个答案:

答案 0 :(得分:2)

我使用read.csv代替read.table

French <- read.csv("F-F_Research_Data_Factors.CSV", sep = ",", skip = 3, 
header = T )

并获得1188次观察。我认为您可以从这里对数据集进行子集化。

答案 1 :(得分:1)

文件中的第一个表位于前两个零长度行之间,因此这将在没有前后垃圾的情况下读取它,然后在指定日期对其进行子集化:

# read first table in file
Lines <- readLines("F-F_Research_Data_Factors.CSV")
ix <- which(Lines == "")
DF0 <- read.csv(text = Lines[ix[1]:ix[2]])  # all rows in first table

# subset it to indicated dates
DF <- subset(DF0, X >= 192607 & X <= 195007)

注意:如果我们想要显示所有表格,以逗号开头的行开始每个表格,空白行结束它们(除了第一个空白行在表格之前),所以使用{{1}从上面给出一个列表Lines,其第i个组件是文件中的第i个表。

L