我的数据是仪器读数和仪器基线。基线数据是准时的,通常不会延伸到数据集的“末端”(即第一行和最后一行)。因此,我想创建一个查看基线列的函数,并将最早和最新基线点的值复制到数据集中的第一行/最后一行,以便我可以使用 approx() 在它们之间进行插值。
到目前为止,我已经手动完成了此操作,如下所示,但我需要一遍又一遍地执行此任务,所以我想将其设为一个函数。 我检查了这里的其他线程,从我读到的内容来看,我认为必须与处理列和单元格的不同方法有关。在 data.frames 中使用自制函数时。
这是一个例子
#Make Two data frames: one holds instrument data, and one holds some
#baseline calibration we need to entend to the ends of the dataset
time<-seq(1,100,1)
data1<-rnorm(n = 100,mean = 7.5, sd = 1.1)
table1<-data.frame(cbind(time, data1))
time<-data.frame("time"=seq(2,96,4))
data2<-(0.32*rnorm(n = 24, mean = 1, sd = 1))
table2<-cbind(time,data2)
rm(time)
#now merge the two tables
newtable<-merge(table1, table2, by="time", all=T)
#remove junk
rm(data1, data2,table1,table2)
#copy 3rd column for later testing
newtable$data3<-newtable$data2
#the old manual way to fill the first row
newtable$data2[1]<-newtable$data2[min(which(!is.na(newtable$data2)))]
#the old manual way to fill the last row
newtable$data2[nrow(newtable)]<-newtable$data2[max(which(!is.na(newtable$data2)))]
#Now i try with a function
endfill<-function(df, col){
#fill the first row
df[1,col] <- df[min(which(!is.na(df[[col]]))), col] # using = instead of <- has no effect
df[nrow(df),col]<-df[max(which(!is.na(df[[col]]))),col]
#
}
#I want to try my funtion in column 4:
endfill(df= newtable,col = 4)
#Does not work...
Another try:
endfill<-function(df, col){
#fill the first row
df$col[1] <- df[[col]] [min(which(!is.na(df[[col]])))] # using $names
#df[nrow(df),col]<-df[max(which(!is.na(df[[col]]))),col]
#
}
endfill(df= newtable,col = 4)
# :-(
在函数中,我尝试了不同的方法来寻址单元格,首先使用 df$col[1],然后也使用 df[[col]][1],以及混合版本,但我似乎在这里错过了一点。 当我分段执行上述函数时,例如仅“<-", they all make sense, i.e. deliver NA values for empty cells or the target value. but it seems impossible to do real assignments ?!
”之前和之后的单个部分非常感谢您的努力!
na.locf
功能的解决方案,来自包 zoo
。
endfill <- function(DF, col) {
if(nrow(DF) > 0L) {
DF[[col]] <- zoo::na.locf(DF[[col]], na.rm = FALSE)
DF[[col]] <- zoo::na.locf(DF[[col]], na.rm = FALSE, fromLast = TRUE)
}
DF
}
df1 <- data.frame(
x1 = c(NA, 1:3, NA),
x2 = c(NA, NA, 1:2, NA)
)
endfill(df1, "x1")
#> x1 x2
#> 1 1 NA
#> 2 1 NA
#> 3 2 1
#> 4 3 2
#> 5 3 NA
endfill(df1, "x2")
#> x1 x2
#> 1 NA 1
#> 2 1 1
#> 3 2 1
#> 4 3 2
#> 5 NA 2
创建于 2024-02-26,使用 reprex v2.0.2