2012-02-15 1 views
1

У меня есть большой фрейм данных (названный г), который выглядит следующим образом:R: Как ускорить эту функцию?

RPos M1 
    1 -0.00020 
    2 0.00010 
    3 -0.00012 
    4 -0.00035 
    5 -0.00038 
...etc (about 300,000 observations) 

Это, по существу, временной ряд (хотя это на самом деле кадр данных, не ts или zoo). Где RPos - номер индекса (явно сохраненный), а M1 - любая метрика.

У меня есть другой фрейм данных (с именем actionlist) с около 30 000 * неизменными наблюдениями. Каждое значение в столбце RPos actionlist представляет собой последнее из 34 последовательных точек.

Мой последний фрагмент данных представляет собой единый фрейм данных (названный x) только из 34 последовательных наблюдений.

Моя цель - рассчитать коэффициенты корреляции между x и каждое наблюдение в списке действий (что опять же является конечной точкой из 34 последовательных наблюдений).

Для этого я должен сгенерировать эти 34-точечные последовательные сегменты временных точечных сегментов от z (большой фрейм данных).

В настоящее время я делаю это так:

n1<-33:0 
for(i in 1:nrow(actionlist)) 
{ 
    crs[i,2]<-cor(z[actionlist$RPos[i]+n1,2],x[,2]) 
} 

При взгляде на Rprof считывании это то, что я получаю:

$by.self 
       self.time self.pct total.time total.pct 
[.data.frame  0.68 25.37  0.98  36.57 
.Call    0.22  8.21  0.22  8.21 
cor    0.16  5.97  2.30  85.82 
...etc 

Это выглядит так, как будто [.data.frame принимает самый длинный. В частности я уверен, что именно эта часть: z[actionlist$RPos[i]+n1,2]

Как можно ускорить (устранить необходимость?) Эта часть функции?

Я задал подобный вопрос раньше, но вместо того, чтобы искать в ограниченном списке (actionlist) Я искал через все возможное подряд 34-наблюдение в г. Ответ был опубликован here,, но я не могу понять, как его адаптировать к ограниченному списку.

Любая помощь будет очень признательна!

+1

Вам будет проще помочь вам, если вы опубликуете какой-нибудь воспроизводимый код и тестовые данные. – Andrie

+3

Кроме того, было бы проще (для меня особенно!), Если бы вы использовали ту же терминологию в этом, что и в предыдущем ответе. И есть ли какая-то причина, по которой вам нужны 'z' и' x' для data.frames ?? Весьма расточительно многократно подмножать то, что вам не нужно, так что, например, вы можете легко взять 'x [, 2]' вне цикла, выполнив 'x2 <- x [, 2]' один раз снаружи и затем ссылаясь на этот вектор в цикле как 'x2'. Точно так же индексирование с использованием '$ Rpos [i]' вообще не требуется, если 'Rpos' сам работает от' 1: nrow (z) '... –

+0

Да, вы определенно правы, в будущем я буду использовать согласованные терминология.Я буду помнить о подмножестве. –

ответ

4

Самый простой способ - построить матрицу, содержащую нужные данные , чтобы вычислить корреляцию и вообще избежать цикла.

# Sample data 
n <- 3e5 
m <- 3e4 
k <- 35 
z <- data.frame(
    RPos = 1:n, 
    M1 = rnorm(n) 
) 
actionlist <- sample(k:n, m) 
x <- rnorm(k) 

system.time(for (j in 1:10) { 
    # Index of the observations we want 
    i <- sapply((k-1):0, function(u) actionlist - u) 
    # Data we want to compute the correlation with 
    y <- matrix(z$M1[i], nr=nrow(i)) 
    # Computations 
    result <- cor(t(y),x) 
}) # 150ms per iteration 
+0

Отлично! Это ускорило тонну. Большое спасибо! –