私が正しく理解していて、ソースデータが本当に適切にフォーマットされていれば、次のようなことができるかもしれません。ここでは、ソースデータがどのように見えるかを複製する3セットの通貨を含むcsvにリンクしています。
まず、を使用してファイルを読み取りますread.csv
が、最初の行はスキップします。check.names = FALSE
重複する列名が許可されるように使用します。
temp <- read.csv("http://ideone.com/plain/t3cGcA",
header = TRUE, skip = 1,
check.names = FALSE)
temp
# Date Contract Last Open High Low Volume Date
# 1 10/10/2012 Dec 100 101 105 99 20000 NA 10/10/2012
# 2 10/11/2012 Dec 101 102 106 98 20100 NA 10/11/2012
# 3 10/12/2012 Jan 102 103 107 97 20120 NA 10/12/2012
# Contract Last Open High Low Volume
# 1 Dec 50 52 49 99 20530
# 2 Dec 53 56 43 98 24300
# 3 Jan 56 52 48 97 22320
# structure(c("NA", "NA", "NA"), class = "AsIs") Date Contract
# 1 NA 10/10/2012 Dec
# 2 NA 10/11/2012 Dec
# 3 NA 10/12/2012 Jan
# Last Open High Low Volume
# 1 500 501 605 99 20000
# 2 600 502 606 98 20100
# 3 700 503 607 97 20120
2番目---そしてここにあなたのデータセットの整頓の1つの仮定があります---seq
あなたの空白の列がどこにあるかのベクトルを作成するために使用します。このことから、整頓の仮定が正しければ、簡単な計算を使用して、各通貨の開始インデックス(ベクトル値から7を引いたもの)と終了インデックス(ベクトル値から1を引いたもの)を決定できます。
myblankcols <- seq(1, ncol(temp), by=8) + 7
myblankcols
# [1] 8 16 24
上記の簡単な計算を使用して、list
各通貨のサブセットのを作成し、リストに名前を追加します。ファイルの最初の行だけをcsvとして再読み込みし、すべてのNA
値を削除することで、名前を取得できます。
tempL <- lapply(seq_along(myblankcols),
function(x) temp[(myblankcols[x] - 7):(myblankcols[x] - 1)])
NamesTempL <- read.csv("http://ideone.com/plain/t3cGcA",
header = FALSE, nrows = 1)
names(tempL) <- NamesTempL[!is.na(NamesTempL)]
tempL
# $`Currency 1`
# Date Contract Last Open High Low Volume
# 1 10/10/2012 Dec 100 101 105 99 20000
# 2 10/11/2012 Dec 101 102 106 98 20100
# 3 10/12/2012 Jan 102 103 107 97 20120
#
# $`Currency 2`
# Date Contract Last Open High Low Volume
# 1 10/10/2012 Dec 50 52 49 99 20530
# 2 10/11/2012 Dec 53 56 43 98 24300
# 3 10/12/2012 Jan 56 52 48 97 22320
#
# $`Currency 3`
# Date Contract Last Open High Low Volume
# 1 10/10/2012 Dec 500 501 605 99 20000
# 2 10/11/2012 Dec 600 502 606 98 20100
# 3 10/12/2012 Jan 700 503 607 97 20120
リストは多くの目的に便利だと思うので、私は通常この時点でやめたくなります。しかし、それを単一に変換することも同様に簡単data.frame
です。これは、最初のステップで使用することを確認する理由の1つでもあります。すべての列が同じ名前である場合、それらを一緒に使用してcheck.names = FALSE
も問題はありません。rbind
do.call(rbind, tempL)
# Date Contract Last Open High Low Volume
# Currency 1.1 10/10/2012 Dec 100 101 105 99 20000
# Currency 1.2 10/11/2012 Dec 101 102 106 98 20100
# Currency 1.3 10/12/2012 Jan 102 103 107 97 20120
# Currency 2.1 10/10/2012 Dec 50 52 49 99 20530
# Currency 2.2 10/11/2012 Dec 53 56 43 98 24300
# Currency 2.3 10/12/2012 Jan 56 52 48 97 22320
# Currency 3.1 10/10/2012 Dec 500 501 605 99 20000
# Currency 3.2 10/11/2012 Dec 600 502 606 98 20100
# Currency 3.3 10/12/2012 Jan 700 503 607 97 20120
ここで絶対にやめますが、ここから、「日付」列を実際の列に変換し、行名(「通貨1.1」、「通貨1.2」など)を次の列に変換することをお勧めします。あなたのdata.frame
。