R中的采样和计算

时间:2013-02-21 23:49:53

标签: r

我有一个包含两列(Time,VA)的文件。文件很大,我设法在R中读取它(使用读取和子集 - 不适用于大文件)。现在,我想根据时间进行采样,每个样本都有样本大小和样本移位。样本大小是整个采样过程的固定值,例如sampleSize = 10秒。样品移位是每个新样品的起点(在第一个样品之后)。例如,如果sampleShift = 4秒且sampleSize为10秒,则意味着第二个样本将从5秒开始并且在样本样本大小= 10秒时增加10秒。对于我想要的每个样品喂 -VA-将函数值赋值给某些计算。

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编号。 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 个答案:

答案 0 :(得分: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

......我认为这就是你要找的东西。

(编辑)

在澄清您希望从特定时间而非随机时间获取样本之后,此函数应该为您提供:

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略小于移位值(显示在by=的{​​{1}}参数中)会给你非重叠的样本。或者,可以将函数中的一个或两个标准从seq>=更改为<=>