我如何正确引用函数中的data.frame单元格

问题描述 投票:0回答:1

我的数据是仪器读数和仪器基线。基线数据是准时的,通常不会延伸到数据集的“末端”(即第一行和最后一行)。因此,我想创建一个查看基线列的函数,并将最早和最新基线点的值复制到数据集中的第一行/最后一行,以便我可以使用 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 ?!

”之前和之后的单个部分

非常感谢您的努力!

r dataframe function cell
1个回答
0
投票

这是一个具有

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

© www.soinside.com 2019 - 2024. All rights reserved.