0

私はRとstackoverflowに非常に慣れていません。私のデータはcsvファイルとしてRに読み込まれています。R内で通貨1を単独で再構築する方法を理解しましたが、900以上の列のデータを処理しており、Rスクリプトをループして、列1から7に行ったことを他の900列に適用する方法が必要です。 。

現在、私のデータは次のようになっています。

Currency 1                                                     Blank    Currency 2
Date        Contract    Last    Open   High    Low   Volume    Column   Date        Contract    Last    Open   High    Low   Volume
10/10/2012   Dec        100     101     105    99    20000     
10/11/2012   Dec        101     102     106    98    20100     
10/12/2012   Jan        102     103     107    97    20120

ご覧のとおり、データは水平方向に送信されます。各通貨の間に空白の列があり、データを積み重ねる必要があります。

データを次のようにしたいと思います。

Date        Contract    Last    Open   High    Low   Volume    Market
10/10/2012   Dec        100     101     105    99    20000     Currency 1
10/11/2012   Dec        101     102     106    98    20100     Currency 1
10/12/2012   Jan        102     103     107    97    20120     Currency 1
10/10/2012   Dec        50      52      49     99    20530     Currency 2
10/11/2012   Dec        53      56      43     98    24300     Currency 2
10/12/2012   Jan        56      52      48     97    22320     Currency 2
4

1 に答える 1

2

私が正しく理解していて、ソースデータが本当に適切にフォーマットされていれば、次のようなことができるかもしれません。ここでは、ソースデータがどのように見えるを複製する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

于 2013-01-26T05:29:25.303 に答える