【问题标题】:how to use loop to subset 1000 csv files and do co-integration test in R?如何使用循环对 1000 个 csv 文件进行子集化并在 R 中进行协整测试?
【发布时间】:2017-01-26 04:25:30
【问题描述】:

数据看起来像sample1 sample2

我有 1000 个 csv 文件,它们都有两列,第一列是 date,第二列是 price。文件有不同的时间段,有些数据从1995年开始,有些数据从2000年开始,因为我需要做协集成测试,所以测试中的所有数据都应该有完全相同的时间点。

我需要从 1000 个 csv 文件中提取相同的时间段,例如从 1998-4-20 开始。

如果我单独使用它会起作用:

newdata208 <- subset(data208, Date >= "1998-04-20")

但是当我尝试循环它们时,会发生错误,有人可以帮我修复错误吗?

v1 <- list()
for (i in 1:length(datasets)) {
  v1[i] <- subset(datasets[i], Date >= "1998-04-20")
}

subset.default(datasets[i], Date >= "1998-04-20") 中的错误: 找不到对象“日期”

对于原始问题,只需在循环中添加get(i),然后问题就解决了,我不知道为什么,谁能告诉我?

v1 <- list()
for (i in 1:length(datasets)) {
  data <- get(i)
  v1[i] <- subset(data, Date >= "1998-04-20")}

那么问题就解决了

更新我的愚蠢代码

#set dictionary.
setwd("F:/xxx/folder")

dataset <- list.files(pattern = "*.CSV")
datasets <- c()
 
for (i in 1:1000)) {
  datasets[i] <- substr(dataset[i], 1, (nchar(dataset[i])-4))
}

# we only need closing price column and date column
setClass("myDate")
setAs("character", "myDate", function(from) as.Date(from, format = "%m/%d/%Y"))

# read date column and closing price column
for (i in 1:length(temps)) {
 
 assign(temps[i], read.csv(temp[i], 
        colClass = c("myDate", rep("NULL", 4), 
        rowClass = "numeric", 
        rep("NULL", 2)), stringsAsFactor = FALSE, header = TRUE))
}
 
# extract same time period
v1 <- c()
for (i in temps) { 
  data <- get(i)
  v1[i] <- subset(data, Date >= "1998-04-20", select = C)
}

# lengths are different, file505 has short time period
index <- subset(file505, Date >= "1998-04-20")
indexs <- index$Date

# try use index to extract data 
selectdate <- which(file001$Date %in% indexs)
file001CLOSE <- file001[selectdate, "C"]

#redo loop to get same period
v2 <- c()
for (i in datasets) { 
  data2 <- get(i)
  v2[[i]] <- data2[selectdate, "C"]
}

v2table <- do.call(cbind,v2)

# right now, data is wonderful, let's begin do time series.
# test co-integration
install.packages("urca")
library("urca")

comb <- combn(1000, 2)
 
pairs <- c()
for (i in 1:499500) { 
  pairs[[i]] <- v2table[, comb[, i]]
}

# test:FF <- pairs[[88]], it is working wonderful, display all details in   result
# do ca.jo 

testresults <- list()
for (i in 1:499500) {
  testdata <- pairs[[i]]
  testresults[[i]] <- ca.jo(testdata, ecdet = "const", type = "eigen", K = 1)
}

它创建了一个包含所有测试结果的巨大列表,我需要拆分测试统计的值和测试的临界值,并找到所有对都有协整因子。

【问题讨论】:

  • 在我看来,其中一个 csv 文件缺少 Date
  • 不,如果我尝试做小样本10个文件,循环仍然不起作用,我不知道为什么

标签: r csv for-loop


【解决方案1】:

我为您准备了一个两步解决方案:

x <- list.files(path = "your directory", pattern = ".csv")
y <- lapply(x,fread)
data <- rbindlist(y)

将目录中的所有 csv 作为数据表读取,然后绑定在一起。

之后,我将按照以下方式进行子集化:

data <- data[Date >= "your dates",]

编辑*

我感觉到您想要引入数据并将其绑定到列/合并。就目前而言,这是不正确的,因为您在每列中都有相同的“C”值。查看您的样本后,如果您要明智地堆叠这些行,您只会得到一个很长的 C 列。我想知道每个 C 列是否代表相同或不同的变量。如果它是一个不同的变量,我已经编写了一些代码来适当地截断您的数据。

我已经使用了您的示例数据 1 和示例数据 2 的前 6 行

    files <- list.files(path = dir, pattern = ".csv")

data_mock <- lapply(files,fread)

data_mock[[1]][, Date := data_mock[[2]][,Date]] 
#I change the dates here because your sample dates are too far apart to test for date truncation to work

for (i in 1:length(data_mock)){
  data_mock[[i]]$Date <- as.Date(data_mock[[i]]$Date, format = "%Y-%m-%d")
}

for (i in 1:length(data_mock)){
  setnames(data_mock[[i]], old = names(data_mock[[i]]), new = c("Date", paste0("C",i)))
}
#I change the variable names here because I'm not sure whether you want to stack Cs ontop of one another or whether each C is a different variable.
#I've assumed each C is different.

start_finish <- function(data, start, finish){
  data[Date >= start & Date <= finish,]
}

results <- list()
for (i in 1:length(data_mock)){
results[[i]] <- start_finish(data_mock[[i]], "1987-01-15", "1987-01-17")
}

这是原始数据的样子:

    [[1]]
         Date      C
1: 1998-04-20 12.667
2: 1998-04-21 12.587
3: 1998-04-22 12.625
4: 1998-04-23 12.601
5: 1998-04-24 12.584
6: 1998-04-25 12.624

[[2]]
         Date     C
1: 1987-01-14 95.89
2: 1987-01-15 97.72
3: 1987-01-16 98.10
4: 1987-01-17 97.07
5: 1987-01-18 98.86
6: 1987-01-19 99.95

这就是在我编写的“start_finish”函数上运行循环后的样子:

[[1]]
         Date      C
1: 1987-01-15 12.587
2: 1987-01-16 12.625
3: 1987-01-17 12.601

[[2]]
         Date    C2
1: 1987-01-15 97.72
2: 1987-01-16 98.10
3: 1987-01-17 97.07

我相信您希望您的数据同时开始和结束?您只需要在我编写的非常简单的函数中更改“开始”和“结束”日期。

这就是你所追求的吗?

【讨论】:

  • 我之前和你一样做过,问题是我需要做一个协整测试,这个测试需要一个每列长度相同的表,如果我做了 rbind 形成一个大column ,我不知道如何将它们分成 1000 列。
  • 我不太明白,你能告诉我你的数据是什么样的吗?也许做 head("your data", n = 10).或者,可以告诉我运行我建议的代码后会发生什么,然后制作一个您希望看到的模拟数据表。其次,如果你只有一个价格变量,你在测试什么协整...价格与什么协整?
  • 请点击页面前面的示例数据,我只是编辑它,这个问题是一个时间序列问题,首先,我有1000个数据,我需要对它们每个进行协整,表示 2C1000,R 有组合功能可以处理,但是它们每个都需要有相同的长度,如果数据像 1998-04-20 一样开始同一时期,那就太好了,我可以申请 head(n= some numbers) 但所有数据都有不同的起点,主管说请提取从1998-04-20到2005-05-15这样的时间段,然后对它们进行协整测试。首先,我必须将 1000 个文件提取到同一时间段。
  • hi,Gin,加一句,get(i),那就万事大吉了,我稍后再贴代码..
  • 你好,Gin,这个项目的目的是学习数据操作,我的U盘里有1000个csv文件,它们都很小,一个一个做起来并不难,但是太无聊了,同时,数据不完整,它们有不同的时间段,但是它们有一个交叉区间,即使在同一时期,某天的某些信息丢失了,我不能允许从互联网上添加丢失的数据,只是找到重叠部分。我使用 %in% 来处理,如果你愿意,你可以检查它,并且我已经使用循环来完成 2C1000 协整测试,但它是一个很大的列表,我现在需要拆分它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多