Search code examples
rsapply

R: adding logical to sapply


I am trying to run this code:

check_zeros <- function(x) { # WIP
  if (x == 0) { 
    !(df[gsub('\\b0+','',format(as.Date(formation$study_start_dates_list[i]),'%m/%d/%Y')), names(x)] == df[gsub('\\b0+','',format(as.Date(formation$study_end_dates_list[i]),'%m/%d/%Y')), names(x)]) 
  } 
}

remove_undesired_stocks2 <- function(n) {

  i = 1
  listofdfs_filtered <- list()


  for (i in 1:n) {
    a <- subset(average_returns, row.names(average_returns) == i)
    b <- as.data.frame(sapply(subset(average_returns, row.names(average_returns) == i), function(x) all(x == 0 | is.nan(x) | check_zeros(x) )))
    c <- a[, !b]
    listofdfs_filtered[[i]] <- c
  }
  return(listofdfs_filtered)
}

Error comes out as: Error in if (x == 0) { : missing value where TRUE/FALSE needed

I think it is bc there is a NaN going into x == 0 of the check_zeros function.

Any how I can overcome this? Thanks in advance.


Solution

  • I think I solved it myself:

    the check_zero function is constructed in a way which cannot take objects with length > 1. more specifically logic inside if cannot use objects length > 1.

    Since I was using a object with length > 1, there was an error

    You should use ifelse in this case:

    check_zeros <- function(x) {
      ifelse(x == 0, (df[gsub('\\b0+','',format(as.Date(formation$study_start_dates_list[i]),'%m/%d/%Y')), names(x)] == df[gsub('\\b0+','',format(as.Date(formation$study_end_dates_list[i]),'%m/%d/%Y')), names(x)]), FALSE)
    }
    

    Cheers.