1

こんにちは、NSE Bhavcopy からダウンロードした csv をマージしていました。日付が異なれば列数も異なります。2006 年 12 月 26 日には 998 行、2006 年 12 月 27 日には 1003 行あったとします。8列あります。cbind を実行して、2 つの列、シンボル、終値だけで a & b を作成します。colnames を使用して列に名前を付けて、マージのために 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ファイルとマージする関数です。2006 年 12 月から 2013 年 4 月までのデータを含む約 1535 個のファイルがあります。また、1535 MB のメモリ割り当てが使い果たされたことを示す警告メッセージも表示されます。また、12番目のファイルで、cのnrowが1508095であることがわかりました。これは、ループが無限に実行されていることを意味します。すべての 1535 ファイルの中で、最も高い行は 1435 でした。特定の日付に上場廃止され、取引されていないすべての株を追加しても、2200 株を超えない可能性があると思います。なぜこれは 150 万の nrow を示しているのですか??

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

本当にしたいですcbindrbind?最後の質問に答えるために。最初に、マップ内のすべての .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 に答える