'Missing value often results in errors in lapply (in R)

I got errors in this code:

FUN = function(files) {
  df_week<- data.table::fread(files)

#Sun rate
for (i in 1: nrow(df_week) ){

#check if df is not NA
if(!is.na(df_week[i])) 
{
    if(df_week$Sun[i] >=10 ) {df_week$Sunr[i] =5}
        ....
 }
}

files = list.files(pattern="1_Stas*")

lapply(files, FUN)

Output:

Error in if (!is.na(df_week[i])) { : argument is of length zero In addition: Warning message: 13 failed to parse.

Why does the code if () {} gives errors?

If the input contains missing value or NA, the ouput should be NaN or NA , and lapply should continue to the next list of files.

I have tried it with a single file without using lapply and function, the output appears in the environment as empty data.

So when I do it one by one, there's no error. When it is done using lapply, very often there would be problems. Should I uses for loop instead?

Any suggestions to fix it and make lapply continue to the next list of files when the previous file contains missing value?

Thanks.

r


Solution 1:[1]

Just use a for loop. The apply family is good for quick one-liners when you need to apply a single operation to one dimension of your data. Your code will become:

files = list.files(pattern="1_Stas*") 
df_week <- data.table::fread(files) # Make sure length(files) == 1

#Sun rate
for (i in 1:nrow(df_week)) {
    #check if df is not NA
    if (!is.na(df_week[i])) {
        if (df_week$Sun[i] >= 10) {
             df_week$Sunr[i] = 5
        }
        ...
    }
}

The line containing if(!is.na(df_week[i])) { needs clarification. From context, length(dim(df_week)) > 1, so you probably want

if (all(!is.na(df_week[i]))) {
...
}

all(!is.na(df_week[i])) returns true when the ith row of df_week containes no NA values.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 algae