0

在 R 环境中加载的各个数据表中,我有 AAPL、GOOG、TXN 等(标准普尔 500 指数的所有成分)的 OHLC+Volume 数据。所有数据表都有 7 列,但并非所有数据表都有相同的行数。

我需要合并所有的表,一个在另一个之上。为了区分合并表中的各个公司,需要一个附加列,其中包含从原始表中获取的所有行的原始表的名称。不存在要合并的表列表。需要合并 R 工作区中的所有现有表。为不清楚而道歉。

性能也可能是一个问题;它可以很容易地跨越 8 行超过 300 万行。尝试使用 plyr 和 reshape,但无济于事。

举个例子:

Table1: named AAPL

   col1 col2
1. 2    4
2. 3    11 

Table2: named GOOG

   col1 col2
1. 10    12
2. 14    19
3. 11    15 


Merged Table: named OUTPUT

   col1 col2  col3
1. 2    4     AAPL
2. 3    11    AAPL
3. 10   12    GOOG
4. 14   19    GOOG
5. 11   15    GOOG

实际数据样本:

 > str(ASTRAZEN)
'data.frame':   3440 obs. of  7 variables:
 $ DATE  : int  20130628 20130628 20130628 20130628 20130628 20130628 20130628 20130628 20130628 20130628 ...
 $ TIME  : int  916 917 918 919 920 921 922 923 924 925 ...
 $ CLOSE : num  660 658 654 657 654 ...
 $ HIGH  : num  660 660 655 657 656 ...
 $ LOW   : num  653 654 654 652 652 ...
 $ OPEN  : num  654 660 655 654 655 ...
 $ VOLUME: int  522 265 320 498 417 138 135 975 132 126 ...`

> head(ASTRAZEN)
      DATE TIME  CLOSE   HIGH    LOW   OPEN VOLUME
1 20130628  916 659.95 659.95 652.55 654.00    522
2 20130628  917 658.00 659.95 654.20 659.95    265
3 20130628  918 654.00 655.00 654.00 655.00    320
4 20130628  919 656.65 656.65 652.50 654.00    498
5 20130628  920 653.65 655.85 651.95 655.00    417
6 20130628  921 654.00 654.50 654.00 654.50    138
4

1 回答 1

2

目前还不是很清楚你将如何在 OP 中拥有一个名称列表,但假设它实际上是一个名称列表,你可以这样做:

library(data.table)
aapl = data.table(col1 = c(2:3), col2 = c(4,11))
goog = data.table(col1 = c(10:12), col2 = c(1:3))

sp = list('aapl', 'goog')
rbindlist(lapply(sp, function(name) get(name)[, col3 := name]))
#   col1 col2 col3
#1:    2    4 aapl
#2:    3   11 aapl
#3:   10    1 goog
#4:   11    2 goog
#5:   12    3 goog

编辑

如果您想列出data.frame环境中的所有对象,然后执行上述操作,您可以执行以下操作:

all.objects = sapply(ls(), function(x) class(get(x)))
sp = names(all.objects[all.objects == 'data.frame'])
rbindlist(lapply(sp, function(name) data.table(get(name))[, col3 := name]))
于 2013-07-19T12:57:41.447 回答