2014-05-12 2 views
1

У меня есть набор данных под названием cpue с 3,3 миллиона строк. Я создал подмножество этого фрейма данных, называемого dat.frame. (См. Ниже главы cpue и dat.frame.) Я добавил два новых поля в dat.frame: «ssh_vec» и «ssh_mag». Хотя главы cpue и dat.frame выглядят одинаково, остальные строки не находятся в одном порядке.Ускорить это для цикла?

head(cpue) 
    code event Lat Long stat_area Day Month Year id 
1 BCO 447602 -43.45 182.73  49 17  3 1995 1 



head(dat.frame) 
    code event Lat Long stat_area Day Month Year id cal.jdate ssh_vec ssh_mag 
1 BCO 447602 -43.45 182.73  49 17  3 1995 1 2449857 56.83898 4.499350 

В настоящее время, я бегу цикл, чтобы добавить ssh_vec и ssh_mag переменные «CPUE» с использованием уникального идентификатора «ID»:

cpue$ssh<- NA 
cpue$sshmag<- NA 

for(i in 1:nrow(dat.frame)) 
{ 
    ndx<- dat.frame$id[i] 
    cpue_full$ssh[ndx]<- dat.frame$ssh_vec[i] 
    cpue_full$sshmag[ndx]<- dat.frame$ssh_mag[i] 
} 

Это уже работает в выходные дни и только до:

i 
[1] 132778 

... из:

nrow(dat.frame) 
[1] 2797789 

Внутри цикла нет ничего, что выглядело бы слишком вычислительно требовательным. Есть ли лучшая альтернатива?

+0

Какова ваша 'sessionInfo() $ platform'? –

+0

"x86_64-w64-mingw32/x64 (64-разрядная версия)" –

ответ

2

Вы уверены, что вам нужна петля for? Я думаю, что это может быть эквивалентно:

cpue_full$ssh[dat.frame$id]<- dat.frame$ssh_vec 
cpue_full$sshmag[dat.frame$id]<- dat.frame$ssh_mag 
+0

Точно, что я после стульев –

1

Я бы порекомендовал взглянуть на data.table. Поскольку у меня нет данных, вот простой пример с использованием фиктивных данных.

library(data.table) 
N = 10^6 
dat <- data.table(
    x = rnorm(1000), 
    g = sample(LETTERS, N, replace = TRUE) 
) 

dat2 <- dat[,list(mx = mean(x)),g] 

h = merge(dat, dat2, 'g') 
1

Вам даже понадобится петля? Из опубликованного фрагмента кода он не появится.

cpue_full$ssh[dat.frame$id] <- dat.frame$ssh_vec 
cpue_full$sshmag[dat.frame$id]<- dat.frame$ssh_mag 

должно работать. Быстрый (маленький) фиктивный пример:

set.seed(666) 
ssh <- rnorm(10^4) 
datf <- data.frame(id = sample.int(10000L), ssh = NA) 

system.time(datf$ssh[datf$id] <- ssh) # user 0, system 0, elapsed 0 

# Reset dummy data 
datf$ssh <- NA 

system.time({ 
    for (i in 1:nrow(datf)) { 
    ndx <- datf$id[i] 
    datf$ssh[ndx] <- ssh[i] 
    } 
}) # user 2.26, system 0.02, elapsed 2.28 

PS - Я не использовал data.table пакет, поэтому я не буду следовать ответ Ramnath в. В общем, вам следует избегать петель, если это возможно (см. Фортуну (142) и круг 3 из In In In In In In In In).

+1

Похоже, что я разместил над вершинами нот. Извини, что, шеф. – Dale

+0

Thankyou. Выполнение вычислений всегда концептуально проще для меня как цикла, моя слабость затем использует альтернативные методы для их выполнения. и спасибо ногам –

Смежные вопросы