1

嗨,我正在合并从 NSE Bhavcopy 下载的 csv。不同的日期有不同的列数。说在 26-12-2006 它有 998 行和 27-12-2006 它有 1003 行。它有 8 列。我做 cbind 以创建 a & b 只有 2 列,符号,收盘价。我使用 colnames 命名 col,以便合并时我可以按 SYMBOL 合并。

问题:

1)当我使用带有by =“SYMBOL”的合并功能时,all = F; 我很惊讶地看到生成的 c 有 1011 行。无论我在哪里阅读,与 all = F 合并它应该变成 998 行或最多 1003 行。我还分析了数据,发现 2006 年 12 月 27 日有 5 个不同的符号,2006 年 12 月 26 日有 3 个不同的符号。那么当我们通过“SYMBOL”合并时,是否会添加来自两行的新符号?或者它只会与先前存在的行合并?

2) NSEmerg 是一个使用 for 循环每次读取新文件并与现有 c 文件合并的函数。我有大约 1535 个文件,其中包含从 2006 年 12 月到 2013 年 4 月的数据。但是我无法合并超过 12 个文件,因为它抛出了 12 MB 的错误向量大小是不允许的。它还显示警告消息,指出 1535 MB 的内存分配已用完。同样在第 12 个文件中,我发现 c 的 nrow 为 1508095,这意味着循环无限运行。在所有的1535个文件中,最高的行是1435个。即使我们把所有退市的股票都加起来,在特定日期没有交易,我相信它可能不会超过2200个股票。为什么这显示 nrow 为 150 万?

3)有没有更好的方法来合并csv?我第一次处于堆栈溢出状态,否则我会附加 10 个文件。

代码:

a <- read.csv("C://Users/home/desktop/061226.csv", stringsAsFactors = F, header = T)
b <- read.csv("C://Users/home/desktop/061227.csv", stringsAsFactors = F, header = T)
a_date <- a[2,1]
b_date <- b[2,1]
a <- cbind(a[,2],a[,6])
b <- cbind(b[,2], b[,6])
colnames(a) <- c("SYMBOL", a_date)
colnames(b) <- c("SYMBOL", b_date)
c <- merge(a,b,by = "SYMBOL", all = F)

NSEmerg <- function(x,y) {
     y_date <- y[2,1]
     y <- cbind(y[,2], y[,6])
     colnames(y) <- c("SYMBOL", y_date)
     c <- merge(c, y, by = "SYMBOL", all = F)
   }

filenames = list.files(path = "C:/Users/home/Documents/Rest data", pattern = "*csv")

for (i in 1:length(filenames)){
    y <- read.csv(filenames[i], header = T, stringsAsFactors = F)
    c <- NSEmerg(c,y)
   }

write.csv(c, file = "NSE.csv")
4

2 回答 2

1

你确定你想cbind不想rbind?回答你的最后一个问题。首先,列出地图中的所有 .csv 文件:

listfiles <- list.files(path="C:/Users/home/desktop", pattern='\\.csv$', full.names=TRUE)

接下来用于do.call读取不同的 csv 文件并将它们与rbind.

df <- do.call(rbind, lapply(listfiles , read.csv))
于 2013-04-26T21:31:56.293 回答
-1

最好只使用 perl 单线:

perl -pe1 file1 file2 file3 ... > newfile

然后你可以剪掉你需要的列

cut -f1,2 -d"," newfile > result
于 2013-04-26T20:20:40.627 回答