我有一个带有时间变量的原始数据,我想根据另一个数据帧(“ periods_F1”)中的时间标准从一个数据帧(“ F1”)中提取该数据,然后针对其每个子集执行多个回归模型希望保存斜率和r平方值。但是,其中一些条件与原始数据文件中不存在的数据有关。
#Example of raw data to be subsetted - F1
TIME DO
1 2017-10-30 07:26:00 6.034845
2 2017-10-30 07:56:00 6.091455
3 2017-10-30 08:26:00 6.140247
4 2017-10-30 08:56:00 6.212884
5 2017-10-30 09:26:00 6.349220
6 2017-10-30 09:56:00 6.531679
7 2017-10-30 10:26:00 6.679428
8 2017-10-30 10:56:00 6.836411
9 2017-10-30 11:26:00 6.960669
#Example of known periods_F1
Unique.ID.no. FLUME START END
1 1 1 2017-11-08 06:33:00 2017-11-08 08:32:00
2 5 1 2017-11-08 09:04:00 2017-11-08 11:52:00
3 9 1 2017-11-08 12:18:00 2017-11-08 15:05:00
4 13 1 2017-11-08 15:39:00 2017-11-08 17:49:00
5 17 1 2017-11-08 18:19:00 2017-11-08 23:32:00
6 21 1 2017-11-09 00:06:00 2017-11-09 05:15:00
7 25 1 2017-11-09 05:55:00 2017-11-09 08:37:00
8 29 1 2017-11-09 09:07:00 2017-11-09 11:49:00
9 33 1 2017-11-09 12:21:00 2017-11-09 15:03:00
首先,我创建一个函数,该函数基于来自另一个数据帧中已知条件的时间间隔对数据进行子集化。我还将建立一个列表,将这些子集数据存储到该列表中,还将建立一个数据框,其中将存储每个回归的汇总系数。
# function for subsetting data and exports oxygen data
oxygensubset<-function(df,time,start,stop) {
o2<-subset(df, time >= start & TIME <= stop) return(o2)}
DO_F1<-list()
DO_DATA<-data.frame(matrix(NA,nrow = nrow(periods_F1), ncol=2)) # Build dataframe, with number of periods as rows - to which we paste Slopes and r2
colnames(DO_DATA)<-c('Slope','R') # Change column names on dataframe, one for slope one for r2
然后,在单个代码中,我基于那些已知条件以及线性回归来运行循环子集。
for(i in 1:nrow(periods_F1)){ # repeating code for all subset
DO_F1[[i]]<-oxygensubset(F1,F1$TIME,periods_F1$START[i],periods_F1$END[i])
DO_R<- try(update(lm(DO~TIME, data = DO_F1[[i]])),TRUE) # Linear model
if(isTRUE(class(DO_R == "try-error"))){return(NULL)} else( # Null if there are missing data....
DO_DATA$Slope[i] <- summary(DO_R)$coefficients[2]) # slope values to rows
DO_DATA$R[i] <-summary(DO_R)$r.squared # r2 values to rows
}
如果我查看“ DO_DATA”,则会找到直到丢失数据的第一个实例的值。通过进一步检查,我认为问题出在子集函数中,因为它在第一次出现缺失值时就停止了。
如何修改子集函数以简单地跳过缺少的值并继续子集下一组现有的值?