2014-11-14 51 views
0

我目前正在编写我的第一个for循环,并且我遇到了一些问题。我创建了一个函数“b.error”,我想将其应用于数据集的每一行。该函数使用每行中的多个列。在我运行我的函数后,我想拉出给出的结果给低于给定的阈值的函数,并将它们放在一个新的矩阵中,并添加了一个用于“b.error”函数结果的列。我想我需要使用,如果该部分声明。R:循环if语句:为多行运行一个函数并填充一个新矩阵

到目前为止,这里就是我的了:

b.max=200050612500 
b.mean=65445001210.3952 
b.sum=3176500943750 
b.tmax=0.5166689375 

data<-read.csv(file.choose(), header=T) 
ID=data[, c(1)] 
Max=data[, c(2)] 
Mean=data[, c(3)] 
Sum=data[, c(4)] 
Tmax=data[, c(5)] 

b.av.error=0.464689312424088 
b.SE=0.0629050598187672 
threshold=b.av.error+b.SE 

b.error<-function(a,b,c,d) 
{max.er<-abs(a-b.max)/max(a, b.max) 
mean.er<-abs(b-b.mean)/max(b, b.mean) 
sum.er<-abs(c-b.sum)/max(c, b.sum) 
tmax.er<-abs(d-b.tmax)/max(d, b.tmax) 
cum<-(max.er+mean.er+sum.er+tmax.er)/4 
cum} 

b.flashes<-matrix(data=NA,nrow=,ncol=6) 
colnames(b.flashes)<-c("ID","BLmax","BLmean","CumSum","Tmax","CumError") 

我在想这样的事情对我的循环,但我停留在如何让我的函数为每一行运行,如何填充b.flashes矩阵,特别是如果我不知道最终会有多少行。

for (i in 1:length(data)){ 
    error<-b.error(Max, Mean, Sum, Tmax) 
    if (error<=threshold) 
} 

我导入的文件是这样设置的。这些是这一特定的数据集的前10行,但所有这一切我需要执行的“b.error”功能的数据集的长度不同

data 
    ID  Blmax  Blmean  Cumsum  Tmax 
1 b.1 3.00762e+10 8518829268 3.76000e+11 0.383330 
2 b.2 1.67000e+11 89634946154 1.67000e+12 0.316670 
3 b.3 1.95000e+11 78450661017 1.06000e+12 0.150000 
4 b.4 2.28000e+11 59976231496 1.93000e+12 0.250000 
5 b.5 2.17266e+10 6730313333 8.89497e+10 0.116670 
6 b.6 2.33142e+10 14368725000 1.68000e+11 0.200000 
7 b.7 1.85000e+11 42342807383 1.95000e+12 0.483330 
8 b.8 1.84000e+11 40587636765 2.47000e+12 0.450000 
9 b.9 2.49000e+11 59006598913 4.22000e+12 0.466670 
10 b.10 6.09000e+11 207000000000 2.59000e+13 1.316700 

有什么建议?

谢谢!

回答

0

您的功能不需要应用于每行data。按照你写的方式运行它,它将返回一个与data相同长度的错误向量。原因是你正在做的每个操作都需要一个数字数组。

只是做

bflashes <- data 
bflashes$CumError <- b.error(data$Blmax, data$Blmean, data$Cumsum, data$Tmax) 

和错误将是一个载体。然后,要筛选您的标准:

bflashes <- subset(bflashes, CumError <= threshold) 

如果需要,作为一个矩阵:as.matrix(bflashes)

相关问题