10

API を呼び出して、200 個までの個々の時系列を抽出するループがあります。

ループは、時系列を xts オブジェクト ( library(xts)) としてサフィックス「.oc」を付けてグローバル環境に出力します。したがって、「ABC.oc」、「ABD.oc」などの形式の xts オブジェクトが 200 個あります。各オブジェクトには 1000 行のデータが含まれています。

私がやりたいことは、すべての「*.oc」オブジェクトを取得して列ごとにマージするループを作成する (または適切な関数を使用する) ことです。IE は次のようになります。

Date           ABC.oc    ABD.oc -> 200 columns like this
2011-01-01      10         10
2011-01-02      20         20
2011-01-03      30         30
2011-01-04      40         40
2011-01-05      50         50

時系列の短いリストを使用すると、次のように記述できます。

m <- merge(ABC.oc,ABD.oc,all=FALSE)

しかし、明らかにこれは 200 個の個別のオブジェクトでは実用的ではないため、「マージ」のようにこれらすべてのオブジェクトをまとめて粉砕するループを作成したいと考えています。

ループの変数にアクセスするのは簡単ですが、ループfor i in length(ls(pattern="*.oc")){の残りの部分を理解することはできません。cbind を試してみましたが、うまくいかないようです。

どんな助けでも大歓迎です

4

2 に答える 2

16

これは、 で終わる名前を持つすべてのオブジェクトの文字ベクトルを取得し、それらをリストに入れ、 via.ocを呼び出すことで実現できます。mergedo.call

# Make up some data
set.seed(21)
x.oc <- xts(rnorm(10), Sys.Date()-10:1)
y.oc <- xts(rnorm(10), Sys.Date()-10:1)
z.oc <- xts(rnorm(10), Sys.Date()-10:1)
x <- y <- z <- 1:10

objNames <- ls(pattern="*oc$")    # object names
objList <- lapply(objNames, get)  # list of objects
names(objList) <- objNames        # assign names to list
do.call(merge, objList)           # merge all objects in list

API から受け取った xts オブジェクトをリスト ( objList) にロードすると、このメソッドを使用する方が簡単になります。次に、必要なのはdo.call(merge, objList).

于 2011-06-17T00:29:17.257 に答える
2

このようなループが機能するはずです。ただし、最初に初期化することを常にお勧めします。

library(xts)

m <- xts(matrix(vector(length=length(ls(pattern="*.oc")) * 
  nrow(get(ls(pattern="*.oc")[1]), ncol=nrow(get(ls(pattern="*.oc")[1])), 
  order.by=index(get(ls(pattern="*.oc")[1]))

for (i in 1:length(ls(pattern="*.oc"))) {
  m[, i]  <- get(ls(pattern="*.oc")[i])
}
于 2011-06-16T23:45:49.767 に答える