首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重组R中的市场数据

重组R中的市场数据
EN

Stack Overflow用户
提问于 2013-01-26 09:02:16
回答 1查看 136关注 0票数 0

我对R和stackoverflow非常陌生。我的数据将以csv文件的形式读入R。

目前我的数据是这样的:

代码语言:javascript
复制
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

如你所见,数据是水平地发送给我的。在每个货币之间有一个空白列,我需要将数据堆叠在彼此的顶部。

我希望数据看起来像这样:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-26 13:29:25

如果我理解正确的话,如果你的源数据的格式确实很好,你也许可以做一些类似下面的事情。这里是I'm linking to a csv with three sets of currencies,它复制了我认为的源数据。

首先,使用read.csv读取文件,但跳过第一行。使用check.names = FALSE,以便允许重复的列名。

代码语言:javascript
复制
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创建一个空白列所在位置的向量。

代码语言:javascript
复制
myblankcols <- seq(1, ncol(temp), by=8) + 7
myblankcols
# [1]  8 16 24

使用上面提到的简单数学方法,创建每种货币子集的list,并将名称添加到列表中。您可以通过重新读取文件的第一行作为csv并删除所有的NA值来获得名称。

代码语言:javascript
复制
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的原因之一:如果所有列都具有相同的名称,那么将它们组合在一起将不会有任何问题。

代码语言:javascript
复制
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

我就到此为止,但是从这里开始,您可能希望将"Date“列转换为实际的列,并可能将行名("Currency 1.1”、"Currency 1.2“等)转换为data.frame中的列。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14532691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档