2012-03-01 15 views
9

Chcę uruchomić funkcję we wszystkich okresach macierzy xts. apply() jest bardzo szybki, ale zwrócona matryca ma transponowane wymiary w porównaniu do oryginalnego obiektu:Dlaczego apply() zwraca transponowaną matrycę xts?

> dim(myxts) 
[1] 7429 48 
> myxts.2 = apply(myxts, 1 , function(x) { return(x) }) 
> dim(myxts.2) 
[1] 48 7429 
> str(myxts) 
An 'xts' object from 2012-01-03 09:30:00 to 2012-01-30 16:00:00 containing: 
    Data: num [1:7429, 1:48] 4092500 4098500 4091500 4090300 4095200 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:48] "Open" "High" "Low" "Close" ... 
    Indexed by objects of class: [POSIXlt,POSIXt] TZ: 
    xts Attributes: 
NULL 
> str(myxts.2) 
num [1:48, 1:7429] 4092500 4098500 4091100 4098500 0 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:48] "Open" "High" "Low" "Close" ... 
    ..$ : chr [1:7429] "2012-01-03 09:30:00" "2012-01-03 09:31:00" "2012-01-03 09:32:00" "2012-01-03 09:33:00" ... 
> nrow(myxts) 
[1] 7429 
> head(myxts) 
         Open High  Low Close 
2012-01-03 09:30:00 4092500 4098500 4091100 4098500 
2012-01-03 09:31:00 4098500 4099500 4092000 4092000 
2012-01-03 09:32:00 4091500 4095000 4090000 4090200 
2012-01-03 09:33:00 4090300 4096400 4090300 4094900 
2012-01-03 09:34:00 4095200 4100000 4095200 4099900 
2012-01-03 09:35:00 4100000 4100000 4096500 4097500 

Jak mogę zachować wymiary myxts?

+1

Pomocny byłby mały fragment danych, abyśmy mogli odtworzyć problem. – Justin

Odpowiedz

15

To właśnie udokumentowano w dokumencie apply. Od ?apply:

Wartość:

If each call to ‘FUN’ returns a vector of length ‘n’, then ‘apply’ 
returns an array of dimension ‘c(n, dim(X)[MARGIN])’ if ‘n > 1’. 

W twoim przypadku, 'n'=48 (bo jesteś zapętlenie nad rzędami), więc apply zwróci tablicę wymiaru c(48, 7429).

Należy również pamiętać, że myxts.2 to , a nie obiekt xts. To regularna tablica. Masz kilka opcji:

  1. transpozycję wyniki apply przed ponownym tworzenia XTS obiektu:

    data(sample_matrix) 
    myxts <- as.xts(sample_matrix) 
    dim(myxts) # [1] 180 4 
    myxts.2 <- apply(myxts, 1 , identity) 
    dim(myxts.2) # [1] 4 180 
    myxts.2 <- xts(t(apply(myxts, 1 , identity)), index(myxts)) 
    dim(myxts.2) # [1] 180 4 
    
  2. Wektoryzacji czynność tak to działa na wszystkich wierszy od uzyskania XTS obiekt i zwraca obiekt xts. Wtedy nie musisz się już martwić o apply.

Na koniec proszę podać powtarzalne przykłady. To nie jest takie trudne i ułatwia ludziom pomaganie. Podałem przykład powyżej i mam nadzieję, że możesz go użyć w poniższych pytaniach.

+0

Jeśli chcę przejść do opcji 2, w jaki sposób mogę przekazać każdy pełny wiersz do mojej funkcji przetwarzania? Na przykład myxts $ result = myxts $ Close - myxts $ Open działa dla określonych pól, ale co jeśli chcę wywołać funkcję przechodzącą przez cały wiersz jako jeden z parametrów? –

+1

@RobertKubrick: Nie mogę odpowiedzieć na to pytanie, nie widząc Twojej funkcji. To może, ale nie musi być możliwe. Co najmniej, możesz zawinąć funkcję przetwarzania w innej funkcji, która wykonuje opcję 1. Nie będzie ona wektoryzowana, ale będzie czystsza, jeśli masz zamiar zrobić to dużo. –

+0

Rozwiązanie 1 jest bardzo szybkie w porównaniu do pętli for. Chciałbym zrozumieć, dlaczego, ale może to inne pytanie. –