2013-02-21 80 views
0

我有一個包含兩列(Time,VA)的文件。該文件很大,我設法讀取它在R(使用讀取和子集 - 不適用於大文件)。現在,我想根據時間進行抽樣,每個樣本都有一個樣本大小和樣本移位。樣本量是整個抽樣過程的固定值,例如, sampleSize = 10秒。樣本移位是每個新樣本的起點(在第一個樣本之後)。例如,如果sampleShift = 4秒並且sampleSize是10秒,則意味着第二個樣本將從5秒開始,並且隨着樣本樣本大小= 10秒增加10秒。對於每個樣本,我想將某個函數的值輸入到一些計算中。R中的採樣和計算

Sampling <- function(values){ 
# Perform the sampling 
lastRowNumber<- #specify the last row manually 
sampleSize<-10 
lastValueInFile<-lastRowNumber-sampleSize 

for (i in 1: (lastValueInFile)){ 
    EndOfShift<-9+i 
    sample<-c(1:sampleSize) 
    h<-1 

    for(j in i:EndOfShift){   
    sample[h] <- values[j,1] 
    h<-h+1 
    } 
    print(sample) 
    #Perform the Calculation on the extracted sample 
    #--Samp_Calculation<-SomFunctionDoCalculation(sample) 
} 
} 

我嘗試的問題是: 1)我必須手動指定LASTROW數爲每個I讀取文件。 2)我試圖根據行數而不是時間值進行採樣。此外,每個樣本的移位都是一個。

文件樣本:

Time  VA 
0.00000 1.000 
0.12026 2.000 
0.13026 2.000 
0.14026 2.000 
0.14371 3.000 
0.14538 4.000 
.......... 
.......... 
15.51805 79.002 
15.51971 79.015 
15.52138 79.028 
15.52304 79.040 
15.52470 79.053 
............. 

爲更專業的方式什麼建議嗎?

回答

1

我產生了一些測試數據如下:

val <- data.frame (time=seq(from=0,to=15,by=0.01),VA=c(0:1500)) 

...那麼函數:

sampTime <- function (values,sampTimeLen) 
{ 
    # return a data frame for a random sample of the data frame -values- 
    # of length -sampTimeLen- 
    minTime <- values$time[1] 
    maxTime <- values$time[length(values$time)] - sampTimeLen 
    startTime <- runif(1,minTime,maxTime) 
    values[(values$time >= startTime) & (values$time <= (startTime+sampTimeLen)),] 
} 

...可以如下使用:

> sampTime(val,0.05) 
    time VA 
857 8.56 856 
858 8.57 857 
859 8.58 858 
860 8.59 859 
861 8.60 860 

...我認爲你在找什麼。

(EDIT)

按照你想從一個特定的時間,而不是一個隨機時間的樣本澄清,這個功能應該給你:

sampTimeFrom <- function (values,sampTimeLen,startTime) 
{ 
    # return a data frame for sample of the data frame -values- 
    # of length -sampTimeLen- from a specific -startTime- 
    values[(values$time >= startTime) & (values$time <= (startTime+sampTimeLen)),] 
} 

...這給:

> sampTimeFrom(val,0.05,0) 
    time VA 
1 0.00 0 
2 0.01 1 
3 0.02 2 
4 0.03 3 
5 0.04 4 
6 0.05 5 
> sampTimeFrom(val,0.05,0.05) 
    time VA 
6 0.05 5 
7 0.06 6 
8 0.07 7 
9 0.08 8 
10 0.09 9 
11 0.10 10 

如果需要多個樣本,它們可以與sapply()提供這樣的:

> samples <- sapply(seq(from=0,to=0.15,by=0.05),function (x) sampTimeFrom(val,0.05,x)) 
> samples[,1] 
$time 
[1] 0.00 0.01 0.02 0.03 0.04 0.05 

$VA 
[1] 0 1 2 3 4 5 

在這種情況下,輸出將重疊,但是使sampTimeLen非常輕微比移值(其在seqby=參數示出)更小會給你不重疊的樣本。或者,功能中的一個或兩個標準可以從>=<=更改爲><

+0

是的,這幾乎是我在找的東西。但是,我不需要隨機抽樣,而是統一對所有時間內容進行抽樣。換句話說,我希望有更多的樣本,直到時間結束(沒有更多樣本)。樣品2和3 .....將由sampleShift進行調節。我試圖添加更多的答案,但是,我只能得到一個樣本。「開始時間<-0 爲(I在1:MAXTIME){ 開始時間< - minTime + STARTTIME 測試<-sampTime(值,sampTimeLen,開始時間) 貓( 」樣品「,I, 」\ n「 個) 打印(測試) 開始時間<-shiftSize }」 – SimpleNEasy 2013-02-22 02:00:43

+0

@ Eng.Mohd:我已經編輯我在希望滿足您澄清的方式回答。 – Simon 2013-02-22 02:50:47

+0

謝謝。完美。 – SimpleNEasy 2013-02-22 04:29:34