Как игнорировать пропущенные значения и NAs в цикле в R?

#r #try-catch #lapply #na

#r #попробуйте-поймать #lapply #na

Вопрос:

Я создал довольно длинный скрипт для перебора списка файлов CSV и выполнения некоторых функций (например, функций lm ()) для каждого файла CSV, и впоследствии я хочу сохранить результаты в виде нового столбца в файле CSV в каждом раунде.

Проблема сейчас в том, что есть значения NA, и где бы они ни находились, файл CSV следует пропустить. Теперь я прочитал, что tryCatch это можно использовать. И я много пытался заставить это работать, но я что-то упускаю. Я получаю эту ошибку: Error in tryCatch({ : object 'slope_CC' not found

Можете ли вы поместить несколько функций в одну функцию tryCatch? Я также смущен тем, как я вызываю все это, поскольку сначала код выполняется для одного файла CSV, а затем он должен выполняться для списка файлов CSV file_paths . Но делается ли это функцией lapply в конце скрипта? slope_list <- lapply(file_paths, NDVI_CC)

Я пропустил то, что не нужно.

Это код:

 setwd("E:/PYTHON_ST/breakCSV_PYTHON/AIM_2_regions/Test")
csv_path <- "E:\PYTHON_ST\breakCSV_PYTHON\AIM_2_regions\Test\selected0.csv"

NDVI_CC <- function(csv_path) {  
  
  df <- read.csv(csv_path, header = TRUE)

  ...  (some data splitting and selecting)
  
  #a) use tryCatch to continue when errors occur
  slope_CC <- tryCatch({
    
  #b) do mutlipe linear regression  
  model <- lm(NDVI ~ T   Prec   soilM, data = BeforeConf)
  #c) use coefficients of MLR in new fomular to calc. new NDVI values
  NDVI_AfterConf_Climate <- summary(model)$coefficients[1,1]   ((summary(model)$coefficients[2,1])*AfterConf$T)    ((summary(model)$coefficients[3,1])*AfterConf$Prec)   ((summary(model)$coefficients[4,1])*AfterConf$soilM)
  #d) create new table and put years and old and new NDVI values in it
  Afterconf_update <- cbind(AfterConf$NDVI_Year, AfterConf$NDVI, NDVI_AfterConf_Climate)
  
  #d) Calculate NDVi slopes for climate control
  # x = years (after conf)
  # y = NDVI_AfterConf_Climate
  lm_func_CC <- lm(AfterConf$NDVI_Year ~ Afterconf_update[ ,3]) # select the 6th column -> NDVI_AfterConf_Climate should be added as a column in step before
  # Get coefficient:
  tmp_coef <- coef(lm_func_CC)
  # Store coefficient:
  slope_CC <- tmp_coef[2]   

  
  #e) Calculate NDVi slopes for normal NDVI
  # x = years (after conf)
  # y = NDVI_AfterConf
  lm_func_old <- lm(AfterConf$NDVI_Year ~ Afterconf_update[ ,2]) # select the 6th column -> NDVI_AfterConf_Climate should be added as a column in step before
  # Get coefficient:
  tmp_coef <- coef(lm_func_old)
  # Store coefficient:
  slope_old <- tmp_coef[2]  
  
    },
    error = function(e){ 

      print(e)
      return(NA)
    },
    warning = function(w){

      print(w)
      return(Warn)
    },
  return(slope_CC)
  )
#return(data_frame(cbind(slope_CC)))
#return(data_frame(cbind(slope_old)))
}
Slopes_CC <- lapply(csv_path, NDVI_CC)
mypath <- "E:\PYTHON_ST\breakCSV_PYTHON\AIM_2_regions\Test"
file_paths <- list.files(pattern=".csv", path=mypath)

# LIST RETURN
slope_list <- lapply(file_paths, NDVI_CC)
  

Заранее благодарим вас за любую помощь или совет!

Комментарии:

1. есть ли какие-либо NAS во всем csv? if (anyNA(df)) return(something)

2. Я знаю из предыдущей версии скрипта, где я использовал tryCatch для первой формулы, что есть значения NA. Но мне нужен скрипт, чтобы игнорировать эти