我是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
答案 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
中的一列。