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

如果我理解正确,并且您的源数据的格式确实很好,您可能可以执行以下操作。在这里,我链接到一个包含三组货币的 csv,这些货币复制了我认为您的源数据的样子。

首先,在 using 中读取文件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.

于 2013-01-26T05:29:25.303 回答