2015-03-27 4 views
1

У меня есть набор наблюдений (гамма и время), записанных с интервалом в 1 секунду. Я хочу переделать эти данные через 0,1 секунды. Данные выглядят следующим образом:Эффективность рекомплектования данных в R (линейная экстраполяция)

38804.96 12.59222222 
38805.12 12.5925 
38805.38 12.59277778 
38805.4  12.59305556 
38805.27 12.59333333 
38805.36 12.59361111 
38805.33 12.59388889 
38805.23 12.59416667 
38805.3  12.59444444 
38805.18 12.59472222 
38805.21 12.595 
38805.28 12.59527778 

я придумал следующий код для повторной выборки (линейно экстраполировать) гамма, но это очень много времени, так как мой набор данных имеет более чем 30000 наблюдений.

#Resampling la diurnal drift 
    j <- (0:9) 
    A <- 0 
    VectorT <- numeric() 
    VectorG <- numeric() 
    for (I in 1:nrow(R20140811)){ 
     # Calculate the increment of time 
     Rate <- (R20140811[I+1,2]- R20140811[I,2])/10 
     Time <- R20140811[I,2] 
     # Calculate the increment of gamma 
     nT <- (R20140811[I+1,1] - R20140811[I,1])/10 
     Gamma <- R20140811[I,1] 
     print(I) 
     for (j in 0:9){ 
      A <- A + 1 
      VectorT[A] <- Time + (j*Rate) 
      VectorG[A] <- Gamma + (j*nT) 
      R20140811[A,3] <- VectorG[A] 
      R20140811[A,4] <- VectorT[A] 
     } 
    } 

Знаете ли вы более эффективный способ сделать это?

ответ

2

Необходимо указать, сколько будет результатов.

Учитывая вашу матрицу:

R20140811 <- matrix(
c(38804.96 ,12.59222222, 
38805.12 ,12.5925 , 
38805.38 ,12.59277778, 
38805.4 ,12.59305556, 
38805.27 ,12.59333333, 
38805.36 ,12.59361111, 
38805.33 ,12.59388889, 
38805.23 ,12.59416667, 
38805.3 ,12.59444444, 
38805.18 ,12.59472222, 
38805.21 ,12.595  , 
38805.28 ,12.59527778),ncol=2,byrow=TRUE) 

Раздельные раз и гаммы:

times <- R20140811[,2] 
gammas <- R20140811[,1] 

Затем определите функцию экстраполяции:

# given a vector vect, extrapole nInt points between points 
Extrapol <- function(vect,nInt){ 
     # the starting points of your intervals 
     zeros <- vect[1:(length (vect)-1)] 
     # determine the increments 
     increments <- (vect[2:length (vect)]-zeros)/nInt 
     # get the new sample 
     newSample <- rep(zeros[1: (length (times)-1)],each=10) + as.vector(outer (0:9,increments)) 
     return(newSample) 
} 

и применить функцию экстраполяции на оба ваше время и гамма

newSampleGamma <- Extrapol(gammas,10) 
newSampleTimes <- Extrapol(times,10) 

Он должен быть на несколько порядков быстрее :-)

+0

Я был тратить много времени, как я написал это ... твой настолько эффективный. Большое спасибо за ваш ответ. – napogeof

+0

Добро пожаловать. И помните, что «upvote» ответ или вопрос - это нормальный способ сказать спасибо на SO :-) – cmbarbu