R市场数据重组

时间:2013-01-26 01:02:16

标签: r

我是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

1 个答案:

答案 0 :(得分:2)

如果我理解正确,并且您的源数据确实格式很好,您可能会执行以下操作。在这里,I'm linking to a csv with three sets of currencies复制了我认为你的源数据的样子。

首先,使用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

第二---这是对数据集整洁的一个假设 - 使用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也同样容易。这也是确保在第一步中使用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中的一列。