2013-02-21 45 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