[英]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.