合并R中的多个csv

时间:2013-04-26 19:50:54

标签: r csv merge dataframe

您好我正在合并从NSE Bhavcopy下载的csv。不同的日期有不同的cols。比如26-12-2006它有998行& 27-12-2006它有1003行。它有8个cols。我做了cbind来创建一个& b只有2个字母,符号,收盘价。我使用colnames命名col,以便合并时我可以通过SYMBOL合并。

问题:

1)当我使用with =“SYMBOL”的合并函数时,all = F;我很惊讶地看到结果c有1011行。我读过的地方,与all = F合并它应该变成998行或最多1003行。我还分析了这些数据,发现在27-12-2006中有5种不同的符号。 26-12-2006中有3个不同的符号。因此,当我们通过“SYMBOL”合并时,是否会添加来自两行的新符号?或者它只会与之前存在的一行合并?

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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:-1)

你可能最好只使用perl one-liner:

perl -pe1 file1 file2 file3 ... > newfile

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

cut -f1,2 -d"," newfile > result