我对R和stackoverflow非常陌生。我的数据将以csv文件的形式读入R。
目前我的数据是这样的:
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发布于 2013-01-26 13:29:25
如果我理解正确的话,如果你的源数据的格式确实很好,你也许可以做一些类似下面的事情。这里是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创建一个空白列所在位置的向量。
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的原因之一:如果所有列都具有相同的名称,那么将它们组合在一起将不会有任何问题。
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中的列。
https://stackoverflow.com/questions/14532691
复制相似问题