繁体   English   中英

R:带有if语句的for循环:为多个行运行一个函数并填充一个新矩阵

[英]R: for loop with if statement: running a function for multiple rows and populating a new matrix

我目前正在编写第一个for循环,但遇到了一些麻烦。 我创建了一个函数“ b.error”,希望将其应用于数据集的每一行。 此函数使用每行中的多列。 运行函数后,我想拉出使函数结果低于给定定义阈值的行,并将其放入新矩阵中,并为“ b.error”函数的结果增加一列。 我当时想我需要在那部分使用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

有什么建议么?

谢谢!

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

做就是了

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

错误将成为一个向量。 然后过滤您的条件:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM